home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / ast.h < prev    next >
C/C++ Source or Header  |  1999-05-14  |  173KB  |  5,691 lines

  1. // $Id: ast.h,v 1.5 1999/03/09 14:37:15 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10.  
  11. #ifndef ast_INCLUDED
  12. #define ast_INCLUDED
  13.  
  14. #include "config.h"
  15. #include <assert.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include "stream.h"
  19. #include "symbol.h"
  20.  
  21. class Parser;
  22. class SemanticEnvironment;
  23.  
  24. //
  25. // Global function used when the space for a dynamic object is
  26. // preallocated,but we need to call a constructor to initialize the
  27. // space.
  28. //
  29. // inline static void *operator new(size_t, void *p) { return p; }
  30. //
  31.  
  32. //**********************************************************************************
  33. //
  34. // This file contains the definitions of the classes used to construct the
  35. // AST representation of a Java program.
  36. //
  37. // The node Ast is a base class of all other classes. (The name of the other classes
  38. // start with the prefix "Ast".) The nodes associated with executable statements
  39. // (e.g., AstIfStatement) are subclasses of AstStatement and nodes associated with
  40. // expressions (e.g., AstBinaryExpression) are subclasses of AstExpression.
  41. //
  42. // The information contained in the AST nodes is described by a grammar where
  43. // each rule consists of a left-hand side nonterminal followed by "-->" followed
  44. // by a right-hand side symbol or a sequence enclosed in the pair of symbols
  45. // "<" and ">". In defining the symbols, the following notation is used:
  46. //
  47. // Symbols that are capitalized (e.g., Type) are nonterminals. Symbols that are
  48. // in all upper case (e.g., PACKAGE) represent node kinds. Symbols that contain
  49. // the substring "_token" represents tokens in the source file. The suffix "_opt"
  50. // indicates that a symbol is optional. For example, if Super_opt appears in a
  51. // rule, it indicates that either Super or null can be expected. When a symbol
  52. // is plural (e.g., Modifiers), it indicates zero or more instances of such a 
  53. // symbol (a list to be precised) can be expected. Thus, when "Modifiers" is
  54. // specified in the right-hand side of a rule either no Modifier or a sequence
  55. // of them may appear.
  56. //
  57. // Implementation Notes:
  58. //
  59. //    A complete AST tree for a Java program always contains an
  60. //    AstCompilationUnit root node. The kind of that node is
  61. //    Ast::EMPTY_COMPILATION for a tree with no type declaration,
  62. //    Ast::COMPILATION for a tree constructed from an otherwise valid program
  63. //    and Ast::BAD_COMPILATION for a tree constructed from an invalid program.
  64. //
  65. //    Since the AST is a tree data structure, each node contains a virtual
  66. //    destructor that can delete its subtrees. Therefore, a user can dispose of
  67. //    a whole ast tree (or subtree) by simply deleting the root node.
  68. //
  69. //    When the preprocessor variable TEST is defined the user may print out
  70. //    an AST tree to standard output by calling the virtual function "print"
  71. //    for the root node of the tree.
  72. //
  73. //    DynamicArrays are used to implement lists. This representation has the
  74. //    advantage of being very flexible and easy to use. However, it may be slightly
  75. //    less time-efficient than a straightforward linked list. My guess is no more
  76. //    that 10% which justifies this use, but that should be checked at some point...
  77. //
  78. //**********************************************************************************
  79.  
  80. //
  81. // This is a complete list of all Ast nodes declared here to allow
  82. // forward references.
  83. //
  84. class Ast;
  85. class AstListNode;
  86. class AstStatement;
  87. class AstExpression;
  88. class AstPrimitiveType;
  89. class AstArrayType;
  90. class AstSimpleName;
  91. class AstPackageDeclaration;
  92. class AstImportDeclaration;
  93. class AstCompilationUnit;
  94. class AstModifier;
  95. class AstEmptyDeclaration;
  96. class AstClassDeclaration;
  97. class AstClassBody;
  98. class AstArrayInitializer;
  99. class AstBrackets;
  100. class AstVariableDeclaratorId;
  101. class AstVariableDeclarator;
  102. class AstFieldDeclaration;
  103. class AstFormalParameter;
  104. class AstMethodDeclarator;
  105. class AstMethodDeclaration;
  106. class AstStaticInitializer;
  107. class AstThisCall;
  108. class AstSuperCall;
  109. class AstConstructorBlock;
  110. class AstConstructorDeclaration;
  111. class AstInterfaceDeclaration;
  112. class AstBlock;
  113. class AstLocalVariableDeclarationStatement;
  114. class AstIfStatement;
  115. class AstEmptyStatement;
  116. class AstExpressionStatement;
  117. class AstCaseLabel;
  118. class AstDefaultLabel;
  119. class AstSwitchBlockStatement;
  120. class AstSwitchStatement;
  121. class AstWhileStatement;
  122. class AstDoStatement;
  123. class AstForStatement;
  124. class AstBreakStatement;
  125. class AstContinueStatement;
  126. class AstReturnStatement;
  127. class AstThrowStatement;
  128. class AstSynchronizedStatement;
  129. class AstCatchClause;
  130. class AstFinallyClause;
  131. class AstTryStatement;
  132. class AstIntegerLiteral;
  133. class AstLongLiteral;
  134. class AstFloatingPointLiteral;
  135. class AstDoubleLiteral;
  136. class AstTrueLiteral;
  137. class AstFalseLiteral;
  138. class AstStringLiteral;
  139. class AstCharacterLiteral;
  140. class AstNullLiteral;
  141. class AstThisExpression;
  142. class AstSuperExpression;
  143. class AstParenthesizedExpression;
  144. class AstClassInstanceCreationExpression;
  145. class AstDimExpr;
  146. class AstArrayCreationExpression;
  147. class AstFieldAccess;
  148. class AstMethodInvocation;
  149. class AstArrayAccess;
  150. class AstPostUnaryExpression;
  151. class AstPreUnaryExpression;
  152. class AstCastExpression;
  153. class AstBinaryExpression;
  154. class AstTypeExpression;
  155. class AstConditionalExpression;
  156. class AstAssignmentExpression;
  157.  
  158. class CaseElement;
  159.  
  160. class StoragePool;
  161.  
  162. //
  163. // The Ast base node.
  164. //
  165. class Ast
  166. {
  167. public:
  168.     //
  169.     // These tags are used to identify nodes that can represent more than
  170.     // one kind of objects.
  171.     //
  172.     enum AstTag
  173.     {
  174.         NO_TAG,
  175.         PRIMITIVE_TYPE,
  176.         STATEMENT,
  177.         EXPRESSION,
  178.         MODIFIER,
  179.         STATIC_FIELD,
  180.         UNPARSED,
  181.  
  182.         _num_tags = MODIFIER
  183.     };
  184.  
  185.     //
  186.     // These are the different kinds for the Ast objects.
  187.     //
  188.     enum AstKind
  189.     {
  190.         AST,
  191.         IDENTIFIER,
  192.         DOT,
  193.         INTEGER_LITERAL,
  194.         LONG_LITERAL,
  195.         FLOATING_POINT_LITERAL,
  196.         DOUBLE_LITERAL,
  197.         TRUE_LITERAL,
  198.         FALSE_LITERAL,
  199.         STRING_LITERAL,
  200.         CHARACTER_LITERAL,
  201.         NULL_LITERAL,
  202.         ARRAY_ACCESS,
  203.         CALL,
  204.         THIS_EXPRESSION,
  205.         SUPER_EXPRESSION,
  206.         PARENTHESIZED_EXPRESSION,
  207.         CLASS_CREATION,
  208.         ARRAY_CREATION,
  209.         POST_UNARY,
  210.         PRE_UNARY,
  211.         CAST,
  212.         CHECK_AND_CAST,
  213.         BINARY,
  214.         TYPE,
  215.         CONDITIONAL,
  216.         ASSIGNMENT,
  217.  
  218.         _num_expression_kinds,
  219.  
  220.         DIM = _num_expression_kinds,
  221.         LIST_NODE,
  222.         INT,
  223.         DOUBLE,
  224.         CHAR,
  225.         LONG,
  226.         FLOAT,
  227.         BYTE,
  228.         SHORT,
  229.         BOOLEAN,
  230.         VOID_TYPE,
  231.         ARRAY,
  232.         COMPILATION,
  233.         BAD_COMPILATION,
  234.         EMPTY_COMPILATION,
  235.         PACKAGE_COMPONENT,
  236.         PACKAGE_NAME,
  237.         PACKAGE,
  238.         IMPORT,
  239.         EMPTY_DECLARATION,
  240.         CLASS,
  241.         CLASS_BODY,
  242.         PUBLIC,
  243.         PROTECTED,
  244.         PRIVATE,
  245.         STATIC,
  246.         ABSTRACT,
  247.         FINAL,
  248.         NATIVE,
  249.         STRICTFP,
  250.         SYNCHRONIZED,
  251.         TRANSIENT,
  252.         VOLATILE,
  253.         FIELD,
  254.         VARIABLE_DECLARATOR,
  255.         VARIABLE_DECLARATOR_NAME,
  256.         BRACKETS,
  257.         METHOD,
  258.         METHOD_DECLARATOR,
  259.         PARAMETER,
  260.         CONSTRUCTOR,
  261.         INTERFACE,
  262.         ARRAY_INITIALIZER,
  263.         STATIC_INITIALIZER,
  264.         THIS_CALL,
  265.         SUPER_CALL,
  266.         BLOCK,
  267.         CONSTRUCTOR_BLOCK,
  268.         LOCAL_VARIABLE_DECLARATION,
  269.         IF,
  270.         EMPTY_STATEMENT,
  271.         EXPRESSION_STATEMENT,
  272.         SWITCH,
  273.         SWITCH_BLOCK,
  274.         CASE,
  275.         DEFAULT,
  276.         WHILE,
  277.         DO,
  278.         FOR,
  279.         BREAK,
  280.         CONTINUE,
  281.         RETURN,
  282.         THROW,
  283.         SYNCHRONIZED_STATEMENT,
  284.         TRY,
  285.         CATCH,
  286.         FINALLY,
  287.  
  288.         _num_kinds
  289.     };
  290.  
  291. #ifdef TEST
  292.     typedef AstKind Kind;
  293.     typedef AstTag  Tag;
  294. #else
  295.     typedef unsigned short Kind;
  296.     typedef unsigned char  Tag;
  297. #endif
  298.  
  299.     Kind          kind;      // every node has a unique kind...
  300.     Tag           class_tag; // Some subsets of nodes are grouped together to form a class of nodes.
  301.     unsigned char generated; // "generated" is a boolean value that indicates whether ot not a node
  302.                              // is associated with a construct in a source file or that is was generated
  303.                              // by the compiler. See functions "gen_ ..." and "new_ ..." below.
  304.  
  305. #ifdef TEST
  306.     unsigned id;
  307.     static unsigned count;
  308.  
  309.     Ast() : id(++count)
  310.     {}
  311. #endif
  312.  
  313.     virtual ~Ast();
  314.  
  315. #ifdef TEST
  316.     virtual void Print(LexStream &);
  317. #endif
  318.  
  319.     //
  320.     // Given an Ast tree, check whether or not it is a Name - simple or qualified.
  321.     //
  322.     bool IsName();
  323.     bool IsLeftHandSide();
  324.     bool IsGenerated();
  325.  
  326.     //
  327.     // The Conversion functions below are provided as a convenient way to
  328.     // cast a generic Ast node into a specific node. Note that if one knows
  329.     // the type of a node for sure, it is more efficient to use a specific
  330.     // cast expression. For example, if one knows that a "Ast *p" pointer
  331.     // dereferences a FieldDeclaration then a cast expression should be
  332.     // used to cast p, as follows:
  333.     //
  334.     //       AstFieldDeclaration *fp = (FieldDeclaration *) p;
  335.     //
  336.     // However, if p points to a ClassBodyDeclaration which may be
  337.     // either a FieldDeclaration, MethodDeclaration, ConstructorDeclaration
  338.     // StaticInitializer, ClassDeclaration, InterfaceDeclaration or a block
  339.     // then the following sequence of code may be used:
  340.     //
  341.     //    AstFieldDeclaration       *fp;
  342.     //    AstMethodDeclaration      *mp;
  343.     //    AstConstructorDeclaration *cp;
  344.     //    AstStaticInitializer      *sp;
  345.     //    AstClassDeclaration       *Cp; // 1.1 only
  346.     //    AstInterfaceDeclaration   *Ip; // 1.1 only
  347.     //    AstBlock                  *Bp; // 1.1 only
  348.     //
  349.     //    if (fp = p -> FieldDeclaration())
  350.     //        ...
  351.     //    else if (mp = p -> MethodDeclaration())
  352.     //        ...
  353.     //    else if (cp = p -> ConstructorDeclaration())
  354.     //        ...
  355.     //    else if (sp = p -> StaticInitializer())
  356.     //        ...
  357.     //    else if (Cp = p -> ClassDeclaration())
  358.     //        ...
  359.     //    else if (Ip = p -> InterfaceDeclaration())
  360.     //        ...
  361.     //    else if (Bp = p -> Block())
  362.     //        ...
  363.     //
  364.  
  365.     //
  366.     // These cast functions are used for classes that represent more than
  367.     // one kind of nodes.
  368.     //
  369.     AstStatement *StatementCast()                        { return (AstStatement *) (class_tag == STATEMENT ? this : NULL); }
  370.     AstExpression *ExpressionCast()                      { return (AstExpression *) (class_tag == EXPRESSION ? this : NULL); }
  371.     AstPrimitiveType *PrimitiveTypeCast()                { return (AstPrimitiveType *) (class_tag == PRIMITIVE_TYPE ? this : NULL); }
  372.     AstModifier *ModifierCast()                          { return (AstModifier *) (class_tag == MODIFIER ? this : NULL); }
  373.     AstFieldDeclaration *StaticFieldCast()               { return (AstFieldDeclaration *) (class_tag == STATIC_FIELD ? this : NULL); }
  374.     AstClassBody *UnparsedClassBodyCast()                { return (AstClassBody *) (class_tag == UNPARSED ? this : NULL); }
  375.     AstInterfaceDeclaration *UnparsedInterfaceBodyCast() { return (AstInterfaceDeclaration *) (class_tag == UNPARSED ? this : NULL); }
  376.  
  377.     //
  378.     // These cast functions are used for classes that represent exactly
  379.     // one kind of node.
  380.     //
  381.     AstListNode *ListNodeCast() { return (AstListNode *) (kind == LIST_NODE ? this : NULL); }
  382.     AstArrayType *ArrayTypeCast() { return (AstArrayType *) (kind == ARRAY ? this : NULL); }
  383.     AstSimpleName *SimpleNameCast() { return (AstSimpleName *) (kind == IDENTIFIER ? this : NULL); }
  384.     AstPackageDeclaration *PackageDeclarationCast() { return (AstPackageDeclaration *) (kind == PACKAGE ? this : NULL); }
  385.     AstImportDeclaration *ImportDeclarationCast() { return (AstImportDeclaration *) (kind == IMPORT ? this : NULL); }
  386.     AstCompilationUnit *CompilationUnitCast()
  387.       { return (AstCompilationUnit *) (kind == COMPILATION || kind == BAD_COMPILATION || kind == EMPTY_COMPILATION ? this : NULL); }
  388.     AstCompilationUnit *BadCompilationUnitCast() { return (AstCompilationUnit *) (kind == BAD_COMPILATION ? this : NULL); }
  389.     AstCompilationUnit *EmptyCompilationUnitCast() { return (AstCompilationUnit *) (kind == EMPTY_COMPILATION ? this : NULL); }
  390.     AstEmptyDeclaration *EmptyDeclarationCast() { return (AstEmptyDeclaration *) (kind == EMPTY_DECLARATION ? this : NULL); }
  391.     AstClassDeclaration *ClassDeclarationCast() { return (AstClassDeclaration *) (kind == CLASS ? this : NULL); }
  392.     AstArrayInitializer *ArrayInitializerCast() { return (AstArrayInitializer *) (kind == ARRAY_INITIALIZER ? this : NULL); }
  393.     AstBrackets *BracketsCast() { return (AstBrackets *) (kind == BRACKETS ? this : NULL); }
  394.     AstVariableDeclaratorId *VariableDeclaratorIdCast()
  395.         { return (AstVariableDeclaratorId *) (kind == VARIABLE_DECLARATOR_NAME ? this : NULL); }
  396.     AstVariableDeclarator *VariableDeclaratorCast()
  397.         { return (AstVariableDeclarator *) (kind == VARIABLE_DECLARATOR ? this : NULL); }
  398.     AstFieldDeclaration *FieldDeclarationCast() { return (AstFieldDeclaration *) (kind == FIELD ? this : NULL); }
  399.     AstFormalParameter *FormalParameterCast() { return (AstFormalParameter *) (kind == PARAMETER ? this : NULL); }
  400.     AstMethodDeclarator *MethodDeclaratorCast() { return (AstMethodDeclarator *) (kind == METHOD_DECLARATOR ? this : NULL); }
  401.     AstMethodDeclaration *MethodDeclarationCast() { return (AstMethodDeclaration *) (kind == METHOD ? this : NULL); }
  402.     AstStaticInitializer *StaticInitializerCast()
  403.         { return (AstStaticInitializer *) (kind == STATIC_INITIALIZER ? this : NULL); }
  404.     AstThisCall *ThisCallCast() { return (AstThisCall *) (kind == THIS_CALL ? this : NULL); }
  405.     AstSuperCall *SuperCallCast() { return (AstSuperCall *) (kind == SUPER_CALL ? this : NULL); }
  406.     AstConstructorBlock *ConstructorBlockCast()
  407.         { return (AstConstructorBlock *) (kind == CONSTRUCTOR_BLOCK ? this : NULL); }
  408.     AstConstructorDeclaration *ConstructorDeclarationCast()
  409.         { return (AstConstructorDeclaration *) (kind == CONSTRUCTOR ? this : NULL); }
  410.     AstInterfaceDeclaration *InterfaceDeclarationCast()
  411.         { return (AstInterfaceDeclaration *) (kind == INTERFACE ? this : NULL); }
  412.     AstBlock *BlockCast() { return (AstBlock *) (kind == BLOCK ? this : NULL); }
  413.     AstLocalVariableDeclarationStatement *LocalVariableDeclarationStatementCast()
  414.         { return (AstLocalVariableDeclarationStatement *) (kind == LOCAL_VARIABLE_DECLARATION ? this : NULL); }
  415.     AstIfStatement *IfStatementCast() { return (AstIfStatement *) (kind == IF ? this : NULL); }
  416.     AstEmptyStatement *EmptyStatementCast() { return (AstEmptyStatement *) (kind == EMPTY_STATEMENT ? this : NULL); }
  417.     AstExpressionStatement *ExpressionStatementCast()
  418.         { return (AstExpressionStatement *) (kind == EXPRESSION_STATEMENT ? this : NULL); }
  419.     AstCaseLabel *CaseLabelCast() { return (AstCaseLabel *) (kind == CASE ? this : NULL); }
  420.     AstDefaultLabel *DefaultLabelCast() { return (AstDefaultLabel *) (kind == DEFAULT ? this : NULL); }
  421.     AstSwitchBlockStatement *SwitchBlockStatementCast()
  422.         { return (AstSwitchBlockStatement *) (kind == SWITCH_BLOCK ? this : NULL); }
  423.     AstSwitchStatement *SwitchStatementCast() { return (AstSwitchStatement *) (kind == SWITCH ? this : NULL); }
  424.     AstWhileStatement *WhileStatementCast() { return (AstWhileStatement *) (kind == WHILE ? this : NULL); }
  425.     AstDoStatement *DoStatementCast() { return (AstDoStatement *) (kind == DO ? this : NULL); }
  426.     AstForStatement *ForStatementCast() { return (AstForStatement *) (kind == FOR ? this : NULL); }
  427.     AstBreakStatement *BreakStatementCast() { return (AstBreakStatement *) (kind == BREAK ? this : NULL); }
  428.     AstContinueStatement *ContinueStatementCast() { return (AstContinueStatement *) (kind == CONTINUE ? this : NULL); }
  429.     AstReturnStatement *ReturnStatementCast() { return (AstReturnStatement *) (kind == RETURN ? this : NULL); }
  430.     AstThrowStatement *ThrowStatementCast() { return (AstThrowStatement *) (kind == THROW ? this : NULL); }
  431.     AstSynchronizedStatement *SynchronizedStatementCast()
  432.         { return (AstSynchronizedStatement *) (kind == SYNCHRONIZED_STATEMENT ? this : NULL); }
  433.     AstCatchClause *CatchClauseCast() { return (AstCatchClause *) (kind == CATCH ? this : NULL); }
  434.     AstFinallyClause *FinallyClauseCast() { return (AstFinallyClause *) (kind == FINALLY ? this : NULL); }
  435.     AstTryStatement *TryStatementCast() { return (AstTryStatement *) (kind == TRY ? this : NULL); }
  436.     AstIntegerLiteral *IntegerLiteralCast() { return (AstIntegerLiteral *) (kind == INTEGER_LITERAL ? this : NULL); }
  437.     AstLongLiteral *LongLiteralCast() { return (AstLongLiteral *) (kind == LONG_LITERAL ? this : NULL); }
  438.     AstFloatingPointLiteral *FloatingPointLiteralCast()
  439.         { return (AstFloatingPointLiteral *) (kind == FLOATING_POINT_LITERAL ? this : NULL); }
  440.     AstDoubleLiteral *DoubleLiteralCast() { return (AstDoubleLiteral *) (kind == DOUBLE_LITERAL ? this : NULL); }
  441.     AstTrueLiteral *TrueLiteralCast() { return (AstTrueLiteral *) (kind == TRUE_LITERAL ? this : NULL); }
  442.     AstFalseLiteral *FalseLiteralCast() { return (AstFalseLiteral *) (kind == FALSE_LITERAL ? this : NULL); }
  443.     AstStringLiteral *StringLiteralCast() { return (AstStringLiteral *) (kind == STRING_LITERAL ? this : NULL); }
  444.     AstCharacterLiteral *CharacterLiteralCast() { return (AstCharacterLiteral *) (kind == CHARACTER_LITERAL ? this : NULL); }
  445.     AstNullLiteral *NullLiteralCast() { return (AstNullLiteral *) (kind == NULL_LITERAL ? this : NULL); }
  446.     AstThisExpression *ThisExpressionCast() { return (AstThisExpression *) (kind == THIS_EXPRESSION ? this : NULL); }
  447.     AstSuperExpression *SuperExpressionCast() { return (AstSuperExpression *) (kind == SUPER_EXPRESSION ? this : NULL); }
  448.     AstParenthesizedExpression *ParenthesizedExpressionCast()
  449.         { return (AstParenthesizedExpression *) (kind == PARENTHESIZED_EXPRESSION ? this : NULL); }
  450.     AstClassInstanceCreationExpression *ClassInstanceCreationExpressionCast()
  451.         { return (AstClassInstanceCreationExpression *) (kind == CLASS_CREATION ? this : NULL); }
  452.     AstDimExpr *DimExprCast() { return (AstDimExpr *) (kind == DIM ? this : NULL); }
  453.     AstArrayCreationExpression *ArrayCreationExpressionCast()
  454.         { return (AstArrayCreationExpression *) (kind == ARRAY_CREATION ? this : NULL); }
  455.     AstFieldAccess *FieldAccessCast() { return (AstFieldAccess *) (kind == DOT ? this : NULL); }
  456.     AstMethodInvocation *MethodInvocationCast() { return (AstMethodInvocation *) (kind == CALL ? this : NULL); }
  457.     AstArrayAccess *ArrayAccessCast() { return (AstArrayAccess *) (kind == ARRAY_ACCESS ? this : NULL); }
  458.     AstPostUnaryExpression *PostUnaryExpressionCast()
  459.         { return (AstPostUnaryExpression *) (kind == POST_UNARY ? this : NULL); }
  460.     AstPreUnaryExpression *PreUnaryExpressionCast()
  461.         { return (AstPreUnaryExpression *) (kind == PRE_UNARY ? this : NULL); }
  462.     AstCastExpression *CastExpressionCast() { return (AstCastExpression *) (kind == CAST || kind == CHECK_AND_CAST ? this : NULL); }
  463.     AstBinaryExpression *BinaryExpressionCast() { return (AstBinaryExpression *) (kind == BINARY ? this : NULL); }
  464.     AstTypeExpression *TypeExpressionCast() { return (AstTypeExpression *) (kind == TYPE ? this : NULL); }
  465.     AstConditionalExpression *ConditionalExpressionCast()
  466.         { return (AstConditionalExpression *) (kind == CONDITIONAL ? this : NULL); }
  467.     AstAssignmentExpression *AssignmentExpressionCast()
  468.         { return (AstAssignmentExpression *) (kind == ASSIGNMENT ? this : NULL); }
  469.  
  470.     virtual Ast *Clone(StoragePool *);
  471.  
  472.     virtual LexStream::TokenIndex LeftToken()  { return 0; }
  473.     virtual LexStream::TokenIndex RightToken() { return 0; }
  474. };
  475.  
  476.  
  477. //
  478. // This AstArray template class can be used to construct a dynamic
  479. // array of arbitrary objects. The space for the array is allocated in
  480. // blocks of size 2**LOG_BLKSIZE. In declaring a Ast array the user
  481. // may specify a value for LOG_BLKSIZE which by default is 6. Also,
  482. // as the array is implemented using a base+offset strategy, the user
  483. // may also specify the number of "slots" to add to the base when the
  484. // current base runs out of space. Each slot points to a block.
  485. //
  486. template <class T>
  487. class AstArray
  488. {
  489.     enum { DEFAULT_LOG_BLKSIZE = 4, DEFAULT_BASE_INCREMENT = 16 };
  490.  
  491.     T **base;
  492.     int base_size,
  493.         top,
  494.         size;
  495.     StoragePool *pool;
  496.     unsigned short log_blksize,
  497.                    base_increment;
  498.  
  499.     inline size_t Blksize() { return (1 << log_blksize); }
  500.  
  501.     //
  502.     // Allocate another block of storage for the Ast array.
  503.     //
  504.     inline void AllocateMoreSpace();
  505.  
  506. public:
  507.  
  508.     //
  509.     // This function is used to reset the size of a Ast array without
  510.     // allocating or deallocting space. It may be invoked with an integer 
  511.     // argument n which indicates the new size or with no argument which
  512.     // indicates that the size should be reset to 0.
  513.     //
  514.     void Reset(const int n = 0)
  515.     {
  516.         if (n < 0 || n > size)
  517.             assert(0);
  518.         top = n;
  519.     }
  520.  
  521.     //
  522.     // Return length of the Ast array.
  523.     //
  524.     int Length() { return top; }
  525.  
  526.     //
  527.     // Return a reference to the ith element of the Ast array.
  528.     //
  529.     // Note that no check is made here to ensure that 0 <= i < top.
  530.     // Such a check might be useful for debugging and a range exception
  531.     // should be thrown if it yields true.
  532.     //
  533.     T& operator[](const int i) { return base[i >> log_blksize][i]; }
  534.  
  535.     //
  536.     // Add an element to the Ast array and return the top index.
  537.     //
  538.     int NextIndex()
  539.     {
  540.         int i = top++;
  541.         if (i == size)
  542.             AllocateMoreSpace();
  543.         return i;
  544.     }
  545.  
  546.     //
  547.     // Add an element to the Ast array and return a reference to
  548.     // that new element. 
  549.     //
  550.     T& Next() { int i = NextIndex(); return base[i >> log_blksize][i]; }
  551.  
  552.     //
  553.     // Constructor of a ast array.
  554.     //
  555.     AstArray(StoragePool *pool_, unsigned estimate = 0) : pool(pool_)
  556.     {
  557.         if (estimate == 0)
  558.         {
  559.             log_blksize = DEFAULT_LOG_BLKSIZE;
  560.             base_increment = DEFAULT_BASE_INCREMENT;
  561.         }
  562.         else
  563.         {
  564.             for (log_blksize = 1; (((unsigned) 1 << log_blksize) < estimate) && (log_blksize < 31); log_blksize++)
  565.                 ;
  566.             if (log_blksize <= DEFAULT_LOG_BLKSIZE)
  567.                 base_increment = 1;
  568.             else if (log_blksize < 13)
  569.             {
  570.                 base_increment = (unsigned) 1 << (log_blksize - 4);
  571.                 log_blksize = 4;
  572.             }
  573.             else
  574.             {
  575.                 base_increment = (unsigned) 1 << (log_blksize - 8);
  576.                 log_blksize = 8;
  577.             }
  578.             base_increment++; // add a little margin to avoid reallocating the base.
  579.         }
  580.  
  581.         base_size = 0;
  582.         size = 0;
  583.         top = 0;
  584.         base = NULL;
  585.     }
  586.  
  587.     //
  588.     // Destructor of an Ast array.
  589.     //
  590.     ~AstArray() { assert(0); }
  591. };
  592.  
  593.  
  594. //
  595. // The Ast base node.
  596. //
  597. class AstListNode : public Ast
  598. {
  599. public:
  600.     AstListNode *next;
  601.     Ast *element;
  602.     unsigned index;
  603.  
  604.     AstListNode()
  605.     {
  606.         Ast::kind = Ast::LIST_NODE;
  607.         Ast::class_tag = Ast::NO_TAG;
  608.         Ast::generated = 0;
  609. #ifdef TEST
  610.         --count; // don't count these nodes
  611. #endif
  612.     }
  613.  
  614.     ~AstListNode() {}
  615. };
  616.  
  617.  
  618. class AstStatement : public Ast
  619. {
  620. public:
  621.     bool is_reachable,
  622.          can_complete_normally;
  623.  
  624.     //
  625.     // Note that for efficiency reasons AstStatement does not have a constructor.
  626.     // Therefore, subclasses that are derived from AstStatement are expected to 
  627.     // initialize the fields is_reachable and can_complete_normally appropriately.
  628.     //
  629.  
  630.     virtual ~AstStatement();
  631.  
  632.     virtual Ast *Clone(StoragePool *) { return (Ast *) NULL; }
  633.  
  634.     virtual LexStream::TokenIndex LeftToken()  { return 0; }
  635.     virtual LexStream::TokenIndex RightToken() { return 0; }
  636. };
  637.  
  638.  
  639. class AstExpression : public Ast
  640. {
  641. public:
  642.     LiteralValue *value;
  643.     Symbol *symbol;
  644.  
  645.     //
  646.     // Note that for efficiency reasons AstExpression does not have a constructor.
  647.     // However, subclasses that are derived from AstExpression are expected to 
  648.     // initialize the fields value and symbol to NULL as indicated below:
  649.     //
  650.     // AstExpression() : value(NULL),
  651.     //                   symbol(NULL)
  652.     // {}
  653.     //
  654.  
  655.     virtual ~AstExpression();
  656.  
  657.     bool IsConstant() { return (value != NULL); }
  658.  
  659.     TypeSymbol *Type()
  660.     {
  661.         return (TypeSymbol *)
  662.                (symbol ? (symbol -> Kind() == Symbol::TYPE
  663.                                   ? (TypeSymbol *) symbol
  664.                                   : (symbol -> Kind() == Symbol::VARIABLE
  665.                                              ? ((VariableSymbol *) symbol) -> Type()
  666.                                              : (symbol -> Kind() == Symbol::METHOD
  667.                                                         ? ((MethodSymbol *) symbol) -> Type((Semantic *) NULL)
  668.                                                         : NULL)))
  669.                        : NULL);
  670.     }
  671.  
  672.     virtual Ast *Clone(StoragePool *) { return (Ast *) NULL; }
  673.  
  674.     virtual LexStream::TokenIndex LeftToken()  { return 0; }
  675.     virtual LexStream::TokenIndex RightToken() { return 0; }
  676. };
  677.  
  678.  
  679. //
  680. // Block --> <BLOCK, {_token, BlockStatements, }_token>
  681. // 
  682. // BlockStatement --> LocalVariableDeclarationStatement
  683. //                  | Statement
  684. //
  685. class AstBlock : public AstStatement
  686. {
  687. private:
  688.  
  689.     StoragePool *pool;
  690.     AstArray<Ast *> *block_statements;
  691.  
  692. public:
  693.     BlockSymbol *block_symbol;
  694.  
  695.     LexStream::TokenIndex label_token_opt;
  696.     int nesting_level;
  697.     LexStream::TokenIndex left_brace_token;
  698.     LexStream::TokenIndex right_brace_token;
  699.  
  700.     AstBlock(StoragePool *pool_) : pool(pool_),
  701.                                    block_statements(NULL),
  702.                                    block_symbol(NULL),
  703.                                    label_token_opt(0),
  704.                                    nesting_level(0)
  705.     {
  706.         Ast::kind = Ast::BLOCK;
  707.         Ast::class_tag = Ast::STATEMENT;
  708.         Ast::generated = 0;
  709.         AstStatement::is_reachable = false;
  710.         AstStatement::can_complete_normally = false;
  711.  
  712.         return;
  713.     }
  714.  
  715.     virtual ~AstBlock();
  716.  
  717.     inline Ast *&Statement(int i) { return (*block_statements)[i]; }
  718.     inline int NumStatements() { return (block_statements ? block_statements -> Length() : 0); }
  719.     inline void AllocateBlockStatements(int estimate = 0);
  720.     inline void AddStatement(Ast *);
  721.  
  722. #ifdef TEST
  723.     virtual void Print(LexStream &);
  724. #endif
  725.  
  726.     virtual Ast *Clone(StoragePool *);
  727.  
  728.     virtual LexStream::TokenIndex LeftToken()  { return left_brace_token; }
  729.     virtual LexStream::TokenIndex RightToken() { return right_brace_token; }
  730. };
  731.  
  732. //
  733. // Type --> PrimitiveType
  734. //        | ReferenceType
  735. // 
  736. // PrimitiveType --> <PrimitiveKind, PrimitiveName>
  737. // 
  738. // PrimitiveKind --> BYTE | SHORT | INT | LONG | CHAR | FLOAT | DOUBLE | BOOLEAN | VOID
  739. //
  740. // PrimitiveName --> byte_token | short_token | int_token | long_token |
  741. //                   char_token | float_token | double_token | boolean_token | void_token
  742. // 
  743. class AstPrimitiveType : public Ast
  744. {
  745. public:
  746.     LexStream::TokenIndex primitive_kind_token;
  747.  
  748.     AstPrimitiveType(Ast::Kind kind_, LexStream::TokenIndex token_) : primitive_kind_token(token_)
  749.     {
  750.         Ast::kind = kind_;
  751.         Ast::class_tag = Ast::PRIMITIVE_TYPE;
  752.         Ast::generated = 0;
  753.     }
  754.  
  755.     virtual ~AstPrimitiveType();
  756.  
  757. #ifdef TEST
  758.     virtual void Print(LexStream &);
  759. #endif
  760.  
  761.     virtual Ast *Clone(StoragePool *);
  762.  
  763.     virtual LexStream::TokenIndex LeftToken()  { return primitive_kind_token; }
  764.     virtual LexStream::TokenIndex RightToken() { return primitive_kind_token; }
  765. };
  766.  
  767.  
  768. //
  769. // Brackets --> <BRACKETS, [_token, ]_token>
  770. // 
  771. class AstBrackets : public Ast
  772. {
  773. public:
  774.     LexStream::TokenIndex left_bracket_token;
  775.     LexStream::TokenIndex right_bracket_token;
  776.  
  777.     AstBrackets(LexStream::TokenIndex left_, LexStream::TokenIndex right_) : left_bracket_token(left_),
  778.                                                                              right_bracket_token(right_)
  779.     {
  780.         Ast::kind = Ast::BRACKETS;
  781.         Ast::class_tag = Ast::NO_TAG;
  782.         Ast::generated = 0;
  783.     }
  784.  
  785.     virtual ~AstBrackets();
  786.  
  787. #ifdef TEST
  788.     virtual void Print(LexStream &);
  789. #endif
  790.  
  791.     virtual Ast *Clone(StoragePool *);
  792.  
  793.     virtual LexStream::TokenIndex LeftToken()  { return left_bracket_token; }
  794.     virtual LexStream::TokenIndex RightToken() { return right_bracket_token; }
  795. };
  796.  
  797.  
  798. //
  799. // ReferenceType --> ClassType
  800. //                 | ArrayType
  801. // 
  802. // ClassType --> Name
  803. //
  804. // ArrayType --> <ARRAY, ArrayKind, [_token, ]_token>
  805. // 
  806. // ArrayKind --> PrimitiveType
  807. //             | Name
  808. //             | ArrayType
  809. // 
  810. class AstArrayType : public Ast
  811. {
  812. private:
  813.  
  814.     StoragePool *pool;
  815.     AstArray<AstBrackets *> *brackets;
  816.  
  817. public:
  818.     Ast *type;
  819.  
  820.     AstArrayType(StoragePool *pool_) : pool(pool_),
  821.                                        brackets(NULL)
  822.     {
  823.         Ast::kind = Ast::ARRAY;
  824.         Ast::class_tag = Ast::NO_TAG;
  825.         Ast::generated = 0;
  826.     }
  827.  
  828.     virtual ~AstArrayType();
  829.  
  830.     inline AstBrackets *&Brackets(int i) { return (*brackets)[i]; }
  831.     inline int NumBrackets() { return (brackets ? brackets -> Length() : 0); }
  832.     inline void AllocateBrackets(int estimate = 0);
  833.     inline void AddBrackets(AstBrackets *);
  834.  
  835. #ifdef TEST
  836.     virtual void Print(LexStream &);
  837. #endif
  838.  
  839.     virtual Ast *Clone(StoragePool *);
  840.  
  841.     virtual LexStream::TokenIndex LeftToken()  { return type -> LeftToken(); }
  842.     virtual LexStream::TokenIndex RightToken() { return Brackets(NumBrackets() - 1) -> RightToken(); }
  843. };
  844.  
  845.  
  846. //
  847. // Name --> SimpleName
  848. //        | FieldAccess
  849. // 
  850. // SimpleName --> <IDENTIFIER, identifier_token>
  851. // 
  852. class AstSimpleName : public AstExpression
  853. {
  854. public:
  855.     LexStream::TokenIndex identifier_token;
  856.  
  857.     //
  858.     // When a simple_name refers to a member in an enclosing scope,
  859.     // it is mapped into a new expression that creates a path to
  860.     // the member in question.
  861.     //
  862.     AstExpression *resolution_opt;
  863.  
  864.     AstSimpleName(LexStream::TokenIndex token_) : identifier_token(token_),
  865.                                                   resolution_opt(NULL)
  866.     {
  867.         Ast::kind = Ast::IDENTIFIER;
  868.         Ast::class_tag = Ast::EXPRESSION;
  869.         Ast::generated = 0;
  870.         AstExpression::value = NULL;
  871.         AstExpression::symbol = NULL;
  872.     }
  873.  
  874.     virtual ~AstSimpleName();
  875.  
  876. #ifdef TEST
  877.     virtual void Print(LexStream &);
  878. #endif
  879.  
  880.     virtual Ast *Clone(StoragePool *);
  881.  
  882.     virtual LexStream::TokenIndex LeftToken()  { return identifier_token; }
  883.     virtual LexStream::TokenIndex RightToken() { return identifier_token; }
  884. };
  885.  
  886. // 
  887. // PackageDeclaration --> <PACKAGE, package_token, Name, ;_token>
  888. //
  889. class AstPackageDeclaration : public Ast
  890. {
  891. public:
  892.     LexStream::TokenIndex package_token;
  893.     AstExpression *name;
  894.     LexStream::TokenIndex semicolon_token;
  895.  
  896.     AstPackageDeclaration()
  897.     {
  898.         Ast::kind = Ast::PACKAGE;
  899.         Ast::class_tag = Ast::NO_TAG;
  900.         Ast::generated = 0;
  901.     }
  902.  
  903.     virtual ~AstPackageDeclaration();
  904.  
  905. #ifdef TEST
  906.     virtual void Print(LexStream &);
  907. #endif
  908.  
  909.     virtual Ast *Clone(StoragePool *);
  910.  
  911.     virtual LexStream::TokenIndex LeftToken()  { return package_token; }
  912.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  913. };
  914.  
  915. //
  916. // ImportDeclaration --> <IMPORT, import_token, Name, *_token_opt, ;_token>
  917. // 
  918. class AstImportDeclaration : public Ast
  919. {
  920. public:
  921.     LexStream::TokenIndex import_token;
  922.     AstExpression *name;
  923.     LexStream::TokenIndex star_token_opt;       // import on demand
  924.     LexStream::TokenIndex semicolon_token;
  925.  
  926.     AstImportDeclaration()
  927.     {
  928.         Ast::kind = Ast::IMPORT;
  929.         Ast::class_tag = Ast::NO_TAG;
  930.         Ast::generated = 0;
  931.     }
  932.  
  933.     virtual ~AstImportDeclaration();
  934.  
  935. #ifdef TEST
  936.     virtual void Print(LexStream &);
  937. #endif
  938.  
  939.     virtual Ast *Clone(StoragePool *);
  940.  
  941.     virtual LexStream::TokenIndex LeftToken()  { return import_token; }
  942.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  943. };
  944.  
  945. //
  946. // CompilationUnit --> <COMPILATION,     PackageDeclaration_opt, ImportDeclarations, TypeDeclarations>
  947. //                   | <BAD_COMPILATION, PackageDeclaration_opt, ImportDeclarations, TypeDeclarations>
  948. //                   | <EMPTY_COMPILATION, PackageDeclaration_opt, ImportDeclarations, TypeDeclarations>
  949. // 
  950. class AstCompilationUnit : public Ast
  951. {
  952. private:
  953.  
  954.     StoragePool *pool;
  955.     AstArray<AstImportDeclaration *> *import_declarations;
  956.     AstArray<Ast *> *type_declarations;
  957.  
  958. public:
  959.     StoragePool *ast_pool;
  960.  
  961.     AstPackageDeclaration *package_declaration_opt;
  962.  
  963.     AstCompilationUnit(StoragePool *pool_) : pool(pool_),
  964.                                              import_declarations(NULL),
  965.                                              type_declarations(NULL)
  966.     {
  967.         Ast::kind = Ast::COMPILATION;
  968.         Ast::class_tag = Ast::NO_TAG;
  969.         Ast::generated = 0;
  970.     }
  971.  
  972.     virtual ~AstCompilationUnit();
  973.  
  974.     void FreeAst();
  975.  
  976.     inline AstImportDeclaration *&ImportDeclaration(int i) { return (*import_declarations)[i]; }
  977.     inline int NumImportDeclarations() { return (import_declarations ? import_declarations -> Length() : 0); }
  978.     inline void AllocateImportDeclarations(int estimate = 0);
  979.     inline void AddImportDeclaration(AstImportDeclaration *);
  980.  
  981.     inline void ResetTypeDeclarations(int n) { if (type_declarations) type_declarations -> Reset(n); }
  982.     inline Ast *&TypeDeclaration(int i) { return (*type_declarations)[i]; }
  983.     inline int NumTypeDeclarations() { return (type_declarations ? type_declarations -> Length() : 0); }
  984.     inline void AllocateTypeDeclarations(int estimate = 0);
  985.     inline void AddTypeDeclaration(Ast *);
  986.  
  987. #ifdef TEST
  988.     virtual void Print(LexStream &);
  989. #endif
  990.  
  991.     virtual Ast *Clone(StoragePool *);
  992.  
  993.     virtual LexStream::TokenIndex LeftToken()
  994.     {
  995.         if (package_declaration_opt)
  996.              return package_declaration_opt -> LeftToken();
  997.         else if (NumImportDeclarations() > 0)
  998.              return ImportDeclaration(0) -> LeftToken();
  999.         else if (NumTypeDeclarations() > 0)
  1000.              return TypeDeclaration(0) -> LeftToken();
  1001.  
  1002.         return 0;
  1003.     }
  1004.  
  1005.     virtual LexStream::TokenIndex RightToken()
  1006.     {
  1007.         if (NumTypeDeclarations() > 0)
  1008.              return TypeDeclaration(NumTypeDeclarations() - 1) -> RightToken();
  1009.         else if (NumImportDeclarations() > 0)
  1010.              return ImportDeclaration(NumImportDeclarations() - 1) -> RightToken();
  1011.         else if (package_declaration_opt)
  1012.              return package_declaration_opt -> RightToken();
  1013.  
  1014.         return 0;
  1015.     }
  1016. };
  1017.  
  1018.  
  1019. //
  1020. // Modifier --> <ModifierKind, ModifierName>
  1021. //
  1022. // ModifierKind --> PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE
  1023. //                  SYNCHRONIZED | TRANSIENT | VOLATILE
  1024. // 
  1025. // ModifierName --> public_token | protected_token | private_token | static_token | abstract_token |
  1026. //                  final_token | native_token | synchronized_token | transient_token | volatile_token
  1027. // 
  1028. class AstModifier : public Ast
  1029. {
  1030. public:
  1031.     LexStream::TokenIndex modifier_kind_token;
  1032.  
  1033.     AstModifier(Ast::Kind kind_, LexStream::TokenIndex token_) : modifier_kind_token(token_)
  1034.     {
  1035.         Ast::kind = kind_;
  1036.         Ast::class_tag = Ast::MODIFIER;
  1037.         Ast::generated = 0;
  1038.     }
  1039.  
  1040.     virtual ~AstModifier();
  1041.  
  1042. #ifdef TEST
  1043.     virtual void Print(LexStream &);
  1044. #endif
  1045.  
  1046.     virtual Ast *Clone(StoragePool *);
  1047.  
  1048.     virtual LexStream::TokenIndex LeftToken()  { return modifier_kind_token; }
  1049.     virtual LexStream::TokenIndex RightToken() { return modifier_kind_token; }
  1050. };
  1051.  
  1052.  
  1053. //
  1054. // EmptyDeclaration --> <EMPTY_DECLARATION, ;_token>
  1055. // 
  1056. class AstEmptyDeclaration : public Ast
  1057. {
  1058. public:
  1059.     LexStream::TokenIndex semicolon_token;
  1060.  
  1061.     AstEmptyDeclaration(LexStream::TokenIndex token_) : semicolon_token(token_)
  1062.     {
  1063.         Ast::kind = Ast::EMPTY_DECLARATION;
  1064.         Ast::class_tag = Ast::NO_TAG;
  1065.         Ast::generated = 0;
  1066.     }
  1067.  
  1068.     virtual ~AstEmptyDeclaration();
  1069.  
  1070. #ifdef TEST
  1071.     virtual void Print(LexStream &);
  1072. #endif
  1073.  
  1074.     virtual Ast *Clone(StoragePool *);
  1075.  
  1076.     virtual LexStream::TokenIndex LeftToken() { return semicolon_token; }
  1077.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  1078. };
  1079.  
  1080. //
  1081. // ClassBody --> <CLASS_BODY, {_token, ClassBodyDeclarations, }_token>
  1082. // 
  1083. class AstClassBody : public Ast
  1084. {
  1085. private:
  1086.     friend class Parser;
  1087.  
  1088.     StoragePool *pool;
  1089.     AstArray<Ast *> *class_body_declarations;
  1090.  
  1091.     AstArray<AstFieldDeclaration *> *instance_variables;
  1092.     AstArray<AstFieldDeclaration *> *class_variables;
  1093.     AstArray<AstMethodDeclaration *> *methods;
  1094.     AstArray<AstConstructorDeclaration *> *constructors;
  1095.     AstArray<AstStaticInitializer *> *static_initializers;
  1096.     AstArray<AstClassDeclaration *> *inner_classes;
  1097.     AstArray<AstInterfaceDeclaration *> *inner_interfaces;
  1098.     AstArray<AstBlock *> *blocks;
  1099.     AstArray<AstEmptyDeclaration *> *empty_declarations;
  1100.  
  1101. public:
  1102.  
  1103.     AstConstructorDeclaration *default_constructor;
  1104.  
  1105.     AstBlock *this_block; // used by inner classes to initialize this$1, ...this$n fields
  1106.  
  1107.     LexStream::TokenIndex left_brace_token;
  1108.     LexStream::TokenIndex right_brace_token;
  1109.  
  1110.     inline void mark_unparsed() { Ast::class_tag = Ast::UNPARSED; }
  1111.     inline void mark_parsed()   { Ast::class_tag = Ast::NO_TAG; }
  1112.  
  1113.     AstClassBody(StoragePool *pool_) : pool(pool_),
  1114.                                        class_body_declarations(NULL),
  1115.                                        default_constructor(NULL),
  1116.                                        instance_variables(NULL),
  1117.                                        class_variables(NULL),
  1118.                                        methods(NULL),
  1119.                                        constructors(NULL),
  1120.                                        static_initializers(NULL),
  1121.                                        inner_classes(NULL),
  1122.                                        inner_interfaces(NULL),
  1123.                                        blocks(NULL),
  1124.                                        empty_declarations(NULL),
  1125.                                        this_block(NULL)
  1126.     {
  1127.         Ast::kind = Ast::CLASS_BODY;
  1128.         Ast::class_tag = Ast::NO_TAG;
  1129.         Ast::generated = 0;
  1130.     }
  1131.  
  1132.     virtual ~AstClassBody();
  1133.  
  1134.     inline Ast *&ClassBodyDeclaration(int i) { return (*class_body_declarations)[i]; }
  1135.     inline int NumClassBodyDeclarations() { return (class_body_declarations ? class_body_declarations -> Length() : 0); }
  1136.     inline void AllocateClassBodyDeclarations(int estimate = 0);
  1137.     inline void AddClassBodyDeclaration(Ast *);
  1138.  
  1139.     inline AstFieldDeclaration *&InstanceVariable(int i) { return (*instance_variables)[i]; }
  1140.     inline int NumInstanceVariables() { return (instance_variables ? instance_variables -> Length() : 0); }
  1141.     inline void AllocateInstanceVariables(int estimate = 0);
  1142.     inline void AddInstanceVariable(AstFieldDeclaration *);
  1143.  
  1144.     inline AstFieldDeclaration *&ClassVariable(int i) { return (*class_variables)[i]; }
  1145.     inline int NumClassVariables() { return (class_variables ? class_variables -> Length() : 0); }
  1146.     inline void AllocateClassVariables(int estimate = 0);
  1147.     inline void AddClassVariable(AstFieldDeclaration *);
  1148.  
  1149.     inline AstMethodDeclaration *&Method(int i) { return (*methods)[i]; }
  1150.     inline int NumMethods() { return (methods ? methods -> Length() : 0); }
  1151.     inline void AllocateMethods(int estimate = 0);
  1152.     inline void AddMethod(AstMethodDeclaration *);
  1153.  
  1154.     inline AstConstructorDeclaration *&Constructor(int i) { return (*constructors)[i]; }
  1155.     inline int NumConstructors() { return (constructors ? constructors -> Length() : 0); }
  1156.     inline void AllocateConstructors(int estimate = 0);
  1157.     inline void AddConstructor(AstConstructorDeclaration *);
  1158.  
  1159.     inline AstStaticInitializer *&StaticInitializer(int i) { return (*static_initializers)[i]; }
  1160.     inline int NumStaticInitializers() { return (static_initializers ? static_initializers -> Length() : 0); }
  1161.     inline void AllocateStaticInitializers(int estimate = 0);
  1162.     inline void AddStaticInitializer(AstStaticInitializer *);
  1163.  
  1164.     inline AstClassDeclaration *&NestedClass(int i) { return (*inner_classes)[i]; }
  1165.     inline int NumNestedClasses() { return (inner_classes ? inner_classes -> Length() : 0); }
  1166.     inline void AllocateNestedClasses(int estimate = 0);
  1167.     inline void AddNestedClass(AstClassDeclaration *);
  1168.  
  1169.     inline AstInterfaceDeclaration *&NestedInterface(int i) { return (*inner_interfaces)[i]; }
  1170.     inline int NumNestedInterfaces() { return (inner_interfaces ? inner_interfaces -> Length() : 0); }
  1171.     inline void AllocateNestedInterfaces(int estimate = 0);
  1172.     inline void AddNestedInterface(AstInterfaceDeclaration *);
  1173.  
  1174.     inline AstBlock *&Block(int i) { return (*blocks)[i]; }
  1175.     inline int NumBlocks() { return (blocks ? blocks -> Length() : 0); }
  1176.     inline void AllocateBlocks(int estimate = 0);
  1177.     inline void AddBlock(AstBlock *);
  1178.  
  1179.     inline AstEmptyDeclaration *&EmptyDeclaration(int i) { return (*empty_declarations)[i]; }
  1180.     inline int NumEmptyDeclarations() { return (empty_declarations ? empty_declarations -> Length() : 0); }
  1181.     inline void AllocateEmptyDeclarations(int estimate = 0);
  1182.     inline void AddEmptyDeclaration(AstEmptyDeclaration *);
  1183.  
  1184. #ifdef TEST
  1185.     virtual void Print(LexStream &);
  1186. #endif
  1187.  
  1188.     virtual Ast *Clone(StoragePool *);
  1189.  
  1190.     virtual LexStream::TokenIndex LeftToken() { return left_brace_token; }
  1191.     virtual LexStream::TokenIndex RightToken() { return right_brace_token; }
  1192. };
  1193.  
  1194.  
  1195.  
  1196. //
  1197. // TypeDeclaration --> ClassDeclaration
  1198. //                   | InterfaceDeclaration
  1199. //                   | EmptyDeclaration
  1200. //
  1201. // ClassDeclaration --> <CLASS, ClassModifiers, class_token, identifier_token, Super_opt, Interfaces, ClassBody>
  1202. //
  1203. // Super --> Name
  1204. // 
  1205. // Interface --> Name
  1206. // 
  1207. // ClassModifier --> Modifier  (ABSTRACT, FINAL or PUBLIC)
  1208. // 
  1209. // ClassBodyDeclaration --> FieldDeclaration
  1210. //                        | MethodDeclaration
  1211. //                        | ConstructorDeclaration
  1212. //                        | StaticInitializer
  1213. // 
  1214. class AstClassDeclaration : public AstStatement
  1215. {
  1216.     StoragePool *pool;
  1217.     AstArray<AstModifier *> *class_modifiers;
  1218.     AstArray<AstExpression *> *interfaces;
  1219.  
  1220. public:
  1221.     SemanticEnvironment *semantic_environment;
  1222.  
  1223.     LexStream::TokenIndex class_token;
  1224.     LexStream::TokenIndex identifier_token;
  1225.     Ast *super_opt;
  1226.     AstClassBody *class_body;
  1227.  
  1228.     AstClassDeclaration(StoragePool *pool_) : pool(pool_),
  1229.                                               class_modifiers(NULL),
  1230.                                               interfaces(NULL),
  1231.                                               semantic_environment(NULL)
  1232.     {
  1233.         Ast::kind = Ast::CLASS;
  1234.         Ast::class_tag = Ast::NO_TAG;
  1235.         Ast::generated = 0;
  1236.     }
  1237.  
  1238.     virtual ~AstClassDeclaration();
  1239.  
  1240.     bool IsValid() { return semantic_environment != NULL; }
  1241.  
  1242.     inline void MarkLocal()
  1243.     {
  1244.         Ast::class_tag = Ast::STATEMENT;
  1245.         AstStatement::is_reachable = true;
  1246.         AstStatement::can_complete_normally = true;
  1247.     }
  1248.  
  1249.     inline AstModifier *&ClassModifier(int i) { return (*class_modifiers)[i]; }
  1250.     inline int NumClassModifiers() { return (class_modifiers ? class_modifiers -> Length() : 0); }
  1251.     inline void AllocateClassModifiers(int estimate = 0);
  1252.     inline void AddClassModifier(AstModifier *);
  1253.  
  1254.     inline AstExpression *&Interface(int i) { return (*interfaces)[i]; }
  1255.     inline int NumInterfaces() { return (interfaces ? interfaces -> Length() : 0); }
  1256.     inline void AllocateInterfaces(int estimate = 0);
  1257.     inline void AddInterface(AstExpression *);
  1258.  
  1259. #ifdef TEST
  1260.     virtual void Print(LexStream &);
  1261. #endif
  1262.  
  1263.     virtual Ast *Clone(StoragePool *);
  1264.  
  1265.     virtual LexStream::TokenIndex LeftToken()
  1266.     {
  1267.         return (NumClassModifiers() > 0 ? (*class_modifiers)[0] -> LeftToken() : class_token);
  1268.     }
  1269.     virtual LexStream::TokenIndex RightToken() { return class_body -> RightToken(); }
  1270. };
  1271.  
  1272.  
  1273. //
  1274. // VariableInitializer --> Expression
  1275. //                       | ArrayInitializer
  1276. // 
  1277. // ArrayInitializer --> <ARRAY_INITIALIZER, {_token, VariableInitializers, }_token>
  1278. // 
  1279. class AstArrayInitializer : public Ast
  1280. {
  1281. private:
  1282.  
  1283.     StoragePool *pool;
  1284.     AstArray<Ast *> *variable_initializers;
  1285.  
  1286. public:
  1287.     LexStream::TokenIndex left_brace_token;
  1288.     LexStream::TokenIndex right_brace_token;
  1289.  
  1290.     AstArrayInitializer(StoragePool *pool_) : pool(pool_),
  1291.                                               variable_initializers(NULL)
  1292.     {
  1293.         Ast::kind = Ast::ARRAY_INITIALIZER;
  1294.         Ast::class_tag = Ast::NO_TAG;
  1295.         Ast::generated = 0;
  1296.     }
  1297.  
  1298.     virtual ~AstArrayInitializer();
  1299.  
  1300.     inline Ast *&VariableInitializer(int i) { return (*variable_initializers)[i]; }
  1301.     inline int NumVariableInitializers() { return (variable_initializers ? variable_initializers -> Length() : 0); }
  1302.     inline void AllocateVariableInitializers(int estimate = 0);
  1303.     inline void AddVariableInitializer(Ast *);
  1304.  
  1305. #ifdef TEST
  1306.     virtual void Print(LexStream &);
  1307. #endif
  1308.  
  1309.     virtual Ast *Clone(StoragePool *);
  1310.  
  1311.     virtual LexStream::TokenIndex LeftToken() { return left_brace_token; }
  1312.     virtual LexStream::TokenIndex RightToken() { return right_brace_token; }
  1313. };
  1314.  
  1315.  
  1316. //
  1317. // VariableDeclaratorId --> <VARIABLE_DECLARATOR_NAME, identifier_token, Brackets>
  1318. // 
  1319. class AstVariableDeclaratorId : public Ast
  1320. {
  1321. private:
  1322.  
  1323.     StoragePool *pool;
  1324.     AstArray<AstBrackets *> *brackets;
  1325.  
  1326. public:
  1327.  
  1328.     LexStream::TokenIndex identifier_token;
  1329.  
  1330.     AstVariableDeclaratorId(StoragePool *pool_) : pool(pool_),
  1331.                                                   brackets(NULL)
  1332.     {
  1333.         Ast::kind = Ast::VARIABLE_DECLARATOR_NAME;
  1334.         Ast::class_tag = Ast::NO_TAG;
  1335.         Ast::generated = 0;
  1336.     }
  1337.  
  1338.     virtual ~AstVariableDeclaratorId();
  1339.  
  1340.     inline AstBrackets *&Brackets(int i) { return (*brackets)[i]; }
  1341.     inline int NumBrackets() { return (brackets ? brackets -> Length() : 0); }
  1342.     inline void AllocateBrackets(int estimate = 0);
  1343.     inline void AddBrackets(AstBrackets *);
  1344.  
  1345. #ifdef TEST
  1346.     virtual void Print(LexStream &);
  1347. #endif
  1348.  
  1349.     virtual Ast *Clone(StoragePool *);
  1350.  
  1351.     virtual LexStream::TokenIndex LeftToken()  { return identifier_token; }
  1352.     virtual LexStream::TokenIndex RightToken()
  1353.     {
  1354.         return (NumBrackets() > 0 ? (*brackets)[NumBrackets() - 1] -> RightToken() : identifier_token);
  1355.     }
  1356. };
  1357.  
  1358.  
  1359. // 
  1360. // VariableDeclarator --> <VARIABLE_DECLARATOR, VariableDeclaratorId, VariableInitializer_opt>
  1361. //
  1362. class AstVariableDeclarator : public Ast
  1363. {
  1364. public:
  1365.     VariableSymbol *symbol;
  1366.     bool pending; // when true, this variable signals that the variable_initializer_opt for this variable is currently being evaluated
  1367.  
  1368.     AstVariableDeclaratorId *variable_declarator_name;
  1369.     Ast *variable_initializer_opt;
  1370.  
  1371.     AstVariableDeclarator() : symbol(NULL),
  1372.                               pending(false)
  1373.     {
  1374.         Ast::kind = Ast::VARIABLE_DECLARATOR;
  1375.         Ast::class_tag = Ast::NO_TAG;
  1376.         Ast::generated = 0;
  1377.     }
  1378.  
  1379.     virtual ~AstVariableDeclarator();
  1380.  
  1381. #ifdef TEST
  1382.     virtual void Print(LexStream &);
  1383. #endif
  1384.  
  1385.     virtual Ast *Clone(StoragePool *);
  1386.  
  1387.     virtual LexStream::TokenIndex LeftToken() { return variable_declarator_name -> LeftToken(); }
  1388.  
  1389.     virtual LexStream::TokenIndex RightToken()
  1390.     {
  1391.         return (variable_initializer_opt ?
  1392.                 variable_initializer_opt -> RightToken() :
  1393.                 variable_declarator_name -> RightToken());
  1394.     }
  1395. };
  1396.  
  1397.  
  1398. //
  1399. // FieldDeclaration --> <FIELD, VariableModifiers, Type, VariableDeclarators, ;_token>
  1400. //
  1401. // FieldModifier --> Modifier (PUBLIC, PROTECTED, PRIVATE, FINAL, STATIC, TRANSIENT or VOLATILE)
  1402. //
  1403. class AstFieldDeclaration : public Ast
  1404. {
  1405.     StoragePool *pool;
  1406.     AstArray<AstModifier *> *variable_modifiers;
  1407.     AstArray<AstVariableDeclarator *> *variable_declarators;
  1408.  
  1409. public:
  1410.  
  1411.     Ast *type;
  1412.     LexStream::TokenIndex semicolon_token;
  1413.  
  1414.     AstFieldDeclaration(StoragePool *pool_) : pool(pool_),
  1415.                                               variable_modifiers(NULL),
  1416.                                               variable_declarators(NULL)
  1417.     {
  1418.         Ast::kind = Ast::FIELD;
  1419.         Ast::class_tag = Ast::NO_TAG;
  1420.         Ast::generated = 0;
  1421.     }
  1422.  
  1423.     virtual ~AstFieldDeclaration();
  1424.  
  1425.     inline void MarkStatic() { Ast::class_tag = Ast::STATIC_FIELD; }
  1426.  
  1427.     inline AstModifier *&VariableModifier(int i) { return (*variable_modifiers)[i]; }
  1428.     inline int NumVariableModifiers() { return (variable_modifiers ? variable_modifiers -> Length() : 0); }
  1429.     inline void AllocateVariableModifiers(int estimate = 0);
  1430.     inline void AddVariableModifier(AstModifier *);
  1431.  
  1432.     inline AstVariableDeclarator *&VariableDeclarator(int i) { return (*variable_declarators)[i]; }
  1433.     inline int NumVariableDeclarators() { return (variable_declarators ? variable_declarators -> Length() : 0); }
  1434.     inline void AllocateVariableDeclarators(int estimate = 0);
  1435.     inline void AddVariableDeclarator(AstVariableDeclarator *);
  1436.  
  1437. #ifdef TEST
  1438.     virtual void Print(LexStream &);
  1439. #endif
  1440.  
  1441.     virtual Ast *Clone(StoragePool *);
  1442.  
  1443.     virtual LexStream::TokenIndex LeftToken()
  1444.     {
  1445.         return (NumVariableModifiers() > 0 ? (*variable_modifiers)[0] -> LeftToken() : type -> LeftToken());
  1446.     }
  1447.  
  1448.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  1449. };
  1450.  
  1451.  
  1452. // 
  1453. // FormalParameter --> <PARAMETER, Type, VariableDeclaratorId>
  1454. // 
  1455. class AstFormalParameter : public Ast
  1456. {
  1457.     StoragePool *pool;
  1458.     AstArray<AstModifier *> *parameter_modifiers;
  1459.  
  1460. public:
  1461.  
  1462.     VariableSymbol *parameter_symbol;
  1463.  
  1464.     Ast *type;
  1465.     AstVariableDeclaratorId *variable_declarator_name;
  1466.  
  1467.     AstFormalParameter(StoragePool *pool_) : pool(pool_),
  1468.                                              parameter_modifiers(NULL)
  1469.     {
  1470.         Ast::kind = Ast::PARAMETER;
  1471.         Ast::class_tag = Ast::NO_TAG;
  1472.         Ast::generated = 0;
  1473.     }
  1474.  
  1475.     virtual ~AstFormalParameter();
  1476.  
  1477.     inline AstModifier *&ParameterModifier(int i) { return (*parameter_modifiers)[i]; }
  1478.     inline int NumParameterModifiers() { return (parameter_modifiers ? parameter_modifiers -> Length() : 0); }
  1479.     inline void AllocateParameterModifiers(int estimate = 0);
  1480.     inline void AddParameterModifier(AstModifier *);
  1481.  
  1482. #ifdef TEST
  1483.     virtual void Print(LexStream &);
  1484. #endif
  1485.  
  1486.     virtual Ast *Clone(StoragePool *);
  1487.  
  1488.     virtual LexStream::TokenIndex LeftToken()
  1489.     {
  1490.        return (NumParameterModifiers() > 0 ? (*parameter_modifiers)[0] -> LeftToken() : type -> LeftToken());
  1491.     }
  1492.     virtual LexStream::TokenIndex RightToken() { return variable_declarator_name -> RightToken(); }
  1493. };
  1494.  
  1495.  
  1496. //
  1497. // MethodDeclarator --> <METHOD_DECLARATOR, identifier_token, (_token, FormalParameters, )_token, Brackets>
  1498. // 
  1499. class AstMethodDeclarator : public Ast
  1500. {
  1501. private:
  1502.  
  1503.     StoragePool *pool;
  1504.     AstArray<AstBrackets *> *brackets;
  1505.     AstArray<AstFormalParameter *> *formal_parameters;
  1506.  
  1507. public:
  1508.     LexStream::TokenIndex identifier_token;
  1509.     LexStream::TokenIndex left_parenthesis_token;
  1510.     LexStream::TokenIndex right_parenthesis_token;
  1511.  
  1512.     AstMethodDeclarator(StoragePool *pool_) : pool(pool_),
  1513.                                               brackets(NULL),
  1514.                                               formal_parameters(NULL)
  1515.     {
  1516.         Ast::kind = Ast::METHOD_DECLARATOR;
  1517.         Ast::class_tag = Ast::NO_TAG;
  1518.         Ast::generated = 0;
  1519.     }
  1520.  
  1521.     virtual ~AstMethodDeclarator();
  1522.  
  1523.     inline AstBrackets *&Brackets(int i) { return (*brackets)[i]; }
  1524.     inline int NumBrackets() { return (brackets ? brackets -> Length() : 0); }
  1525.     inline void AllocateBrackets(int estimate = 0);
  1526.     inline void AddBrackets(AstBrackets *);
  1527.  
  1528.     inline AstFormalParameter *&FormalParameter(int i) { return (*formal_parameters)[i]; }
  1529.     inline int NumFormalParameters() { return (formal_parameters ? formal_parameters -> Length() : 0); }
  1530.     inline void AllocateFormalParameters(int estimate = 0);
  1531.     inline void AddFormalParameter(AstFormalParameter *);
  1532.  
  1533. #ifdef TEST
  1534.     virtual void Print(LexStream &);
  1535. #endif
  1536.  
  1537.     virtual Ast *Clone(StoragePool *);
  1538.  
  1539.     virtual LexStream::TokenIndex LeftToken() { return identifier_token; }
  1540.  
  1541.     virtual LexStream::TokenIndex RightToken()
  1542.     {
  1543.         return (NumBrackets() ? Brackets(NumBrackets() - 1) -> RightToken() : right_parenthesis_token);
  1544.     }
  1545. };
  1546.  
  1547.  
  1548. //
  1549. // MethodDeclaration --> <METHOD, MethodModifiers, Type, MethodDeclarator, Throws, MethodBody>
  1550. //
  1551. // MethodModifier --> Modifier (PUBLIC, PROTECTED, PRIVATE, STATIC, ABSTRACT, FINAL, NATIVE or SYNCHRONIZED)
  1552. // 
  1553. // Throws --> Names
  1554. // 
  1555. // MethodBody --> Block
  1556. //              | EmptyStatement
  1557. // 
  1558. class AstMethodDeclaration : public Ast
  1559. {
  1560.     StoragePool *pool;
  1561.     AstArray<AstModifier *> *method_modifiers;
  1562.     AstArray<AstExpression *> *throws;
  1563.  
  1564. public:
  1565.     MethodSymbol *method_symbol;
  1566.  
  1567.     Ast *type;
  1568.     AstMethodDeclarator *method_declarator;
  1569.     AstStatement *method_body;
  1570.  
  1571.     AstMethodDeclaration(StoragePool *pool_) : pool(pool_),
  1572.                                                method_modifiers(NULL),
  1573.                                                throws(NULL),
  1574.                                                method_symbol(NULL)
  1575.     {
  1576.         Ast::kind = Ast::METHOD;
  1577.         Ast::class_tag = Ast::NO_TAG;
  1578.         Ast::generated = 0;
  1579.     }
  1580.  
  1581.     virtual ~AstMethodDeclaration();
  1582.  
  1583.     bool IsValid() { return method_symbol != NULL; }
  1584.  
  1585.     bool IsSignature() { return (method_body -> EmptyStatementCast() != NULL); }
  1586.  
  1587.     inline AstModifier *&MethodModifier(int i) { return (*method_modifiers)[i]; }
  1588.     inline int NumMethodModifiers() { return (method_modifiers ? method_modifiers -> Length() : 0); }
  1589.     inline void AllocateMethodModifiers(int estimate = 0);
  1590.     inline void AddMethodModifier(AstModifier *);
  1591.  
  1592.     inline AstExpression *&Throw(int i) { return (*throws)[i]; }
  1593.     inline int NumThrows() { return (throws ? throws -> Length() : 0); }
  1594.     inline void AllocateThrows(int estimate = 0);
  1595.     inline void AddThrow(AstExpression *);
  1596.  
  1597. #ifdef TEST
  1598.     virtual void Print(LexStream &);
  1599. #endif
  1600.  
  1601.     virtual Ast *Clone(StoragePool *);
  1602.  
  1603.     virtual LexStream::TokenIndex LeftToken()
  1604.     {
  1605.         return (NumMethodModifiers() > 0 ? (*method_modifiers)[0] -> LeftToken() : type -> LeftToken());
  1606.     }
  1607.     virtual LexStream::TokenIndex RightToken() { return method_body -> RightToken(); }
  1608. };
  1609.  
  1610. //
  1611. // StaticInitializer --> <STATIC_INITIALIZER, static_token, Block>
  1612. // 
  1613. class AstStaticInitializer : public Ast
  1614. {
  1615. public:
  1616.     LexStream::TokenIndex static_token;
  1617.     AstBlock *block;
  1618.  
  1619.     AstStaticInitializer()
  1620.     {
  1621.         Ast::kind = Ast::STATIC_INITIALIZER;
  1622.         Ast::class_tag = Ast::NO_TAG;
  1623.         Ast::generated = 0;
  1624.     }
  1625.  
  1626.     virtual ~AstStaticInitializer();
  1627.  
  1628. #ifdef TEST
  1629.     virtual void Print(LexStream &);
  1630. #endif
  1631.  
  1632.     virtual Ast *Clone(StoragePool *);
  1633.  
  1634.     virtual LexStream::TokenIndex LeftToken() { return static_token; }
  1635.     virtual LexStream::TokenIndex RightToken() { return block -> RightToken(); }
  1636. };
  1637.  
  1638.  
  1639. // 
  1640. // ThisCall --> <THIS_CALL, this_token, (_token, Arguments, )_token, ;_token>
  1641. //
  1642. // Argument --> Expression
  1643. // 
  1644. class AstThisCall : public AstStatement
  1645. {
  1646. private:
  1647.  
  1648.     StoragePool *pool;
  1649.     AstArray<AstExpression *> *arguments;
  1650.     AstArray<AstExpression *> *local_arguments_opt; // used only for local classes that use enclosed local variables
  1651.  
  1652. public:
  1653.     MethodSymbol *symbol;
  1654.  
  1655.     AstExpression *base_opt;
  1656.     LexStream::TokenIndex dot_token_opt;
  1657.     LexStream::TokenIndex this_token;
  1658.     LexStream::TokenIndex left_parenthesis_token;
  1659.     LexStream::TokenIndex right_parenthesis_token;
  1660.     LexStream::TokenIndex semicolon_token;
  1661.  
  1662.     AstThisCall(StoragePool *pool_) : pool(pool_),
  1663.                                       arguments(NULL),
  1664.                                       local_arguments_opt(NULL),
  1665.                                       symbol(NULL)
  1666.     {
  1667.         Ast::kind = Ast::THIS_CALL;
  1668.         Ast::class_tag = Ast::STATEMENT;
  1669.         Ast::generated = 0;
  1670.         AstStatement::is_reachable = false;
  1671.         AstStatement::can_complete_normally = false;
  1672.     }
  1673.  
  1674.     virtual ~AstThisCall();
  1675.  
  1676.     inline AstExpression *&Argument(int i) { return (*arguments)[i]; }
  1677.     inline int NumArguments() { return (arguments ? arguments -> Length() : 0); }
  1678.     inline void AllocateArguments(int estimate = 0);
  1679.     inline void AddArgument(AstExpression *);
  1680.  
  1681.     inline AstExpression *&LocalArgument(int i) { return (*local_arguments_opt)[i]; }
  1682.     inline int NumLocalArguments() { return (local_arguments_opt ? local_arguments_opt -> Length() : 0); }
  1683.     inline void AllocateLocalArguments(int estimate = 0);
  1684.     inline void AddLocalArgument(AstExpression *);
  1685.  
  1686. #ifdef TEST
  1687.     virtual void Print(LexStream &);
  1688. #endif
  1689.  
  1690.     virtual Ast *Clone(StoragePool *);
  1691.  
  1692.     virtual LexStream::TokenIndex LeftToken() { return this_token; }
  1693.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  1694. };
  1695.  
  1696.  
  1697. //
  1698. // SuperCall --> <SUPER_CALL, super_token, (_token, Arguments, )_token, ;_token>
  1699. //             | <SUPER_CALL, SuperField, (_token, Arguments, )_token, ;_token>
  1700. // 
  1701. class AstSuperCall : public AstStatement
  1702. {
  1703. private:
  1704.  
  1705.     StoragePool *pool;
  1706.     AstArray<AstExpression *> *arguments;
  1707.     AstArray<AstExpression *> *local_arguments_opt; // used only for local classes that use enclosed local variables
  1708.  
  1709. public:
  1710.     MethodSymbol *symbol;
  1711.  
  1712.     AstExpression *base_opt;
  1713.     LexStream::TokenIndex dot_token_opt;
  1714.     LexStream::TokenIndex super_token;
  1715.     LexStream::TokenIndex left_parenthesis_token;
  1716.     LexStream::TokenIndex right_parenthesis_token;
  1717.     LexStream::TokenIndex semicolon_token;
  1718.  
  1719.     AstSuperCall(StoragePool *pool_) : pool(pool_),
  1720.                                        arguments(NULL),
  1721.                                        local_arguments_opt(NULL),
  1722.                                        symbol(NULL)
  1723.     {
  1724.         Ast::kind = Ast::SUPER_CALL;
  1725.         Ast::class_tag = Ast::STATEMENT;
  1726.         Ast::generated = 0;
  1727.         AstStatement::is_reachable = false;
  1728.         AstStatement::can_complete_normally = false;
  1729.     }
  1730.  
  1731.     virtual ~AstSuperCall();
  1732.  
  1733.     inline AstExpression *&Argument(int i) { return (*arguments)[i]; }
  1734.     inline int NumArguments() { return (arguments ? arguments -> Length() : 0); }
  1735.     inline void AllocateArguments(int estimate = 0);
  1736.     inline void AddArgument(AstExpression *);
  1737.  
  1738.     inline AstExpression *&LocalArgument(int i) { return (*local_arguments_opt)[i]; }
  1739.     inline int NumLocalArguments() { return (local_arguments_opt ? local_arguments_opt -> Length() : 0); }
  1740.     inline void AllocateLocalArguments(int estimate = 0);
  1741.     inline void AddLocalArgument(AstExpression *);
  1742.  
  1743. #ifdef TEST
  1744.     virtual void Print(LexStream &);
  1745. #endif
  1746.  
  1747.     virtual Ast *Clone(StoragePool *);
  1748.  
  1749.     virtual LexStream::TokenIndex LeftToken() { return (base_opt ? base_opt -> LeftToken() : super_token); }
  1750.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  1751. };
  1752.  
  1753.  
  1754. //
  1755. // ConstructorDeclaration --> <CONSTRUCTOR, Constructormodifiers, MethodDeclarator, Throws, ConstructorBody>
  1756. // 
  1757. // ConstructorBody --> <CONSTRUCTOR_BLOCK, {_token, ExplicitConstructorInvocation, BlockStatements, }_token>
  1758. //                   | MethodBody
  1759. // 
  1760. // ConstructorModifier --> Modifier (PUBLIC, PROTECTED or PRIVATE)
  1761. // 
  1762. // ExplicitConstructorInvocation --> ThisCall
  1763. //                                 | SuperCall
  1764. //
  1765. class AstConstructorBlock : public AstStatement
  1766. {
  1767. private:
  1768.  
  1769.     StoragePool *pool;
  1770.     AstArray<AstStatement *> *local_init_statements;
  1771.  
  1772. public:
  1773.     BlockSymbol *block_symbol;
  1774.  
  1775.     LexStream::TokenIndex left_brace_token;
  1776.     Ast *explicit_constructor_invocation_opt;
  1777.     AstBlock *block;
  1778.     LexStream::TokenIndex right_brace_token;
  1779.  
  1780.     AstExpressionStatement *original_constructor_invocation;
  1781.  
  1782.     AstConstructorBlock(StoragePool *pool_) : pool(pool_),
  1783.                                               local_init_statements(NULL),
  1784.                                               block_symbol(NULL),
  1785.                                               original_constructor_invocation(NULL)
  1786.     {
  1787.         Ast::kind = Ast::CONSTRUCTOR_BLOCK;
  1788.         Ast::class_tag = Ast::STATEMENT;
  1789.         Ast::generated = 0;
  1790.         AstStatement::is_reachable = false;
  1791.         AstStatement::can_complete_normally = false;
  1792.     }
  1793.  
  1794.     virtual ~AstConstructorBlock();
  1795.  
  1796.     inline AstStatement *&LocalInitStatement(int i) { return (*local_init_statements)[i]; }
  1797.     inline int NumLocalInitStatements() { return (local_init_statements ? local_init_statements -> Length() : 0); }
  1798.     inline void AllocateLocalInitStatements(int estimate = 0);
  1799.     inline void AddLocalInitStatement(AstStatement *);
  1800.  
  1801. #ifdef TEST
  1802.     virtual void Print(LexStream &);
  1803. #endif
  1804.  
  1805.     virtual Ast *Clone(StoragePool *);
  1806.  
  1807.     virtual LexStream::TokenIndex LeftToken()  { return left_brace_token;  }
  1808.     virtual LexStream::TokenIndex RightToken() { return right_brace_token; }
  1809. };
  1810.  
  1811.  
  1812. class AstConstructorDeclaration : public Ast
  1813. {
  1814.     StoragePool *pool;
  1815.     AstArray<AstModifier *> *constructor_modifiers;
  1816.     AstArray<AstExpression *> *throws;
  1817.  
  1818. public:
  1819.     MethodSymbol *constructor_symbol;
  1820.     int index;
  1821.  
  1822.     AstMethodDeclarator *constructor_declarator;
  1823.     AstConstructorBlock *constructor_body;
  1824.  
  1825.     AstConstructorDeclaration(StoragePool *pool_) : pool(pool_),
  1826.                                                     throws(NULL),
  1827.                                                     constructor_modifiers(NULL),
  1828.                                                     constructor_symbol(NULL),
  1829.                                                     index(CycleChecker::OMEGA)
  1830.     {
  1831.         Ast::kind = Ast::CONSTRUCTOR;
  1832.         Ast::class_tag = Ast::NO_TAG;
  1833.         Ast::generated = 0;
  1834.     }
  1835.  
  1836.     virtual ~AstConstructorDeclaration();
  1837.  
  1838.     bool IsValid() { return constructor_symbol != NULL; }
  1839.  
  1840.     inline AstModifier *&ConstructorModifier(int i) { return (*constructor_modifiers)[i]; }
  1841.     inline int NumConstructorModifiers() { return (constructor_modifiers ? constructor_modifiers -> Length() : 0); }
  1842.     inline void AllocateConstructorModifiers(int estimate = 0);
  1843.     inline void AddConstructorModifier(AstModifier *);
  1844.  
  1845.     inline AstExpression *&Throw(int i) { return (*throws)[i]; }
  1846.     inline int NumThrows() { return (throws ? throws -> Length() : 0); }
  1847.     inline void AllocateThrows(int estimate = 0);
  1848.     inline void AddThrow(AstExpression *);
  1849.  
  1850. #ifdef TEST
  1851.     virtual void Print(LexStream &);
  1852. #endif
  1853.  
  1854.     virtual Ast *Clone(StoragePool *);
  1855.  
  1856.     virtual LexStream::TokenIndex LeftToken()
  1857.     {
  1858.         return (NumConstructorModifiers() > 0 ? (*constructor_modifiers)[0] -> LeftToken() : constructor_declarator -> LeftToken());
  1859.     }
  1860.     virtual LexStream::TokenIndex RightToken() { return constructor_body -> RightToken(); }
  1861. };
  1862.  
  1863.  
  1864. //
  1865. // InterfaceDeclaration --> <INTERFACE, Interfacemodifiers, interface_token, identifier_token, ExtendsInterfaces, {_token, InterfaceMemberDeclarations, }_token>
  1866. // 
  1867. // InterfaceModifier --> Modifier (PUBLIC, ABSTRACT)
  1868. // 
  1869. // ExtendsInterfaces --> Names
  1870. // 
  1871. // 
  1872. // InterfaceMemberDeclaration --> ConstantDeclaration
  1873. //                              | AbstractMethodDeclaration
  1874. //
  1875. // ConstantDeclaration --> FieldDeclaration (where the FieldModifierList is a Constantmodifiers)
  1876. // 
  1877. // ConstantModifier --> Modifier (PUBLIC, STATIC or FINAL)
  1878. //
  1879. // AbstractMethodDeclaration --> MethodDeclaration (where MethodModifierList is a SignatureModifierList and the 
  1880. //                                                  MethodBody is an EmptyStatement)
  1881. // 
  1882. // SignatureModifier --> Modifier (PUBLIC or ABSTRACT)
  1883. // 
  1884. class AstInterfaceDeclaration : public Ast
  1885. {
  1886. private:
  1887.     friend class Parser;
  1888.  
  1889.     StoragePool *pool;
  1890.     AstArray<AstModifier *> *interface_modifiers;
  1891.     AstArray<AstExpression *> *extends_interfaces;
  1892.     AstArray<Ast *> *interface_member_declarations;
  1893.  
  1894.     AstArray<AstFieldDeclaration *> *class_variables;
  1895.     AstArray<AstMethodDeclaration *> *methods;
  1896.     AstArray<AstClassDeclaration *> *inner_classes;
  1897.     AstArray<AstInterfaceDeclaration *> *inner_interfaces;
  1898.     AstArray<AstEmptyDeclaration *> *empty_declarations;
  1899.  
  1900. public:
  1901.  
  1902.     SemanticEnvironment *semantic_environment;
  1903.  
  1904.     LexStream::TokenIndex interface_token;
  1905.     LexStream::TokenIndex identifier_token;
  1906.     LexStream::TokenIndex left_brace_token;
  1907.     LexStream::TokenIndex right_brace_token;
  1908.  
  1909.     inline void mark_unparsed() { Ast::class_tag = Ast::UNPARSED; }
  1910.     inline void mark_parsed()   { Ast::class_tag = Ast::NO_TAG; }
  1911.  
  1912.     AstInterfaceDeclaration(StoragePool *pool_) : pool(pool_),
  1913.                                                   interface_modifiers(NULL),
  1914.                                                   extends_interfaces(NULL),
  1915.                                                   interface_member_declarations(NULL),
  1916.                                                   semantic_environment(NULL),
  1917.                                                   class_variables(NULL),
  1918.                                                   methods(NULL),
  1919.                                                   inner_classes(NULL),
  1920.                                                   inner_interfaces(NULL),
  1921.                                                   empty_declarations(NULL)
  1922.     {
  1923.         Ast::kind = Ast::INTERFACE;
  1924.         Ast::class_tag = Ast::NO_TAG;
  1925.         Ast::generated = 0;
  1926.     }
  1927.  
  1928.     virtual ~AstInterfaceDeclaration();
  1929.  
  1930.     bool IsValid() { return semantic_environment != NULL; }
  1931.  
  1932.     inline AstModifier *&InterfaceModifier(int i) { return (*interface_modifiers)[i]; }
  1933.     inline int NumInterfaceModifiers() { return (interface_modifiers ? interface_modifiers -> Length() : 0); }
  1934.     inline void AllocateInterfaceModifiers(int estimate = 0);
  1935.     inline void AddInterfaceModifier(AstModifier *);
  1936.  
  1937.     inline AstExpression *&ExtendsInterface(int i) { return (*extends_interfaces)[i]; }
  1938.     inline int NumExtendsInterfaces() { return (extends_interfaces ? extends_interfaces -> Length() : 0); }
  1939.     inline void AllocateExtendsInterfaces(int estimate = 0);
  1940.     inline void AddExtendsInterface(AstExpression *);
  1941.  
  1942.     inline Ast *&InterfaceMemberDeclaration(int i) { return (*interface_member_declarations)[i]; }
  1943.     inline int NumInterfaceMemberDeclarations()
  1944.                { return (interface_member_declarations ? interface_member_declarations -> Length() : 0); }
  1945.     inline void AllocateInterfaceMemberDeclarations(int estimate = 0);
  1946.     inline void AddInterfaceMemberDeclaration(Ast *);
  1947.  
  1948.     inline AstFieldDeclaration *&ClassVariable(int i) { return (*class_variables)[i]; }
  1949.     inline int NumClassVariables() { return (class_variables ? class_variables -> Length() : 0); }
  1950.     inline void AllocateClassVariables(int estimate = 0);
  1951.     inline void AddClassVariable(AstFieldDeclaration *);
  1952.  
  1953.     inline AstMethodDeclaration *&Method(int i) { return (*methods)[i]; }
  1954.     inline int NumMethods() { return (methods ? methods -> Length() : 0); }
  1955.     inline void AllocateMethods(int estimate = 0);
  1956.     inline void AddMethod(AstMethodDeclaration *);
  1957.  
  1958.     inline AstClassDeclaration *&NestedClass(int i) { return (*inner_classes)[i]; }
  1959.     inline int NumNestedClasses() { return (inner_classes ? inner_classes -> Length() : 0); }
  1960.     inline void AllocateNestedClasses(int estimate = 0);
  1961.     inline void AddNestedClass(AstClassDeclaration *);
  1962.  
  1963.     inline AstInterfaceDeclaration *&NestedInterface(int i) { return (*inner_interfaces)[i]; }
  1964.     inline int NumNestedInterfaces() { return (inner_interfaces ? inner_interfaces -> Length() : 0); }
  1965.     inline void AllocateNestedInterfaces(int estimate = 0);
  1966.     inline void AddNestedInterface(AstInterfaceDeclaration *);
  1967.  
  1968.     inline AstEmptyDeclaration *&EmptyDeclaration(int i) { return (*empty_declarations)[i]; }
  1969.     inline int NumEmptyDeclarations() { return (empty_declarations ? empty_declarations -> Length() : 0); }
  1970.     inline void AllocateEmptyDeclarations(int estimate = 0);
  1971.     inline void AddEmptyDeclaration(AstEmptyDeclaration *);
  1972.  
  1973. #ifdef TEST
  1974.     virtual void Print(LexStream &);
  1975. #endif
  1976.  
  1977.     virtual Ast *Clone(StoragePool *);
  1978.  
  1979.     virtual LexStream::TokenIndex LeftToken()
  1980.     {
  1981.         return (NumInterfaceModifiers() > 0 ? (*interface_modifiers)[0] -> LeftToken() : interface_token);
  1982.     }
  1983.     virtual LexStream::TokenIndex RightToken() { return right_brace_token; }
  1984. };
  1985.  
  1986.  
  1987. //
  1988. // LocalVariableDeclarationStatement --> <LOCAL_VARIABLE_DECLARATION, Type, VariableDeclarators, ;_token_opt>
  1989. //
  1990. class AstLocalVariableDeclarationStatement : public AstStatement
  1991. {
  1992.     StoragePool *pool;
  1993.     AstArray<AstModifier *> *local_modifiers;
  1994.     AstArray<AstVariableDeclarator *> *variable_declarators;
  1995.  
  1996. public:
  1997.     Ast *type;
  1998.     LexStream::TokenIndex semicolon_token_opt;
  1999.  
  2000.     AstLocalVariableDeclarationStatement(StoragePool *pool_) : pool(pool_),
  2001.                                                                local_modifiers(NULL),
  2002.                                                                variable_declarators(NULL)
  2003.     {
  2004.         Ast::kind = Ast::LOCAL_VARIABLE_DECLARATION;
  2005.         Ast::class_tag = Ast::STATEMENT;
  2006.         Ast::generated = 0;
  2007.         AstStatement::is_reachable = false;
  2008.         AstStatement::can_complete_normally = false;
  2009.     }
  2010.  
  2011.     virtual ~AstLocalVariableDeclarationStatement();
  2012.  
  2013.     inline AstModifier *&LocalModifier(int i) { return (*local_modifiers)[i]; }
  2014.     inline int NumLocalModifiers() { return (local_modifiers ? local_modifiers -> Length() : 0); }
  2015.     inline void AllocateLocalModifiers(int estimate = 0);
  2016.     inline void AddLocalModifier(AstModifier *);
  2017.  
  2018.     inline AstVariableDeclarator *&VariableDeclarator(int i) { return (*variable_declarators)[i]; }
  2019.     inline int NumVariableDeclarators() { return (variable_declarators ? variable_declarators -> Length() : 0); }
  2020.     inline void AllocateVariableDeclarators(int estimate = 0);
  2021.     inline void AddVariableDeclarator(AstVariableDeclarator *);
  2022.  
  2023. #ifdef TEST
  2024.     virtual void Print(LexStream &);
  2025. #endif
  2026.  
  2027.     virtual Ast *Clone(StoragePool *);
  2028.  
  2029.     virtual LexStream::TokenIndex LeftToken()
  2030.     {
  2031.         return (NumLocalModifiers() > 0 ? (*local_modifiers)[0] -> LeftToken() : type -> LeftToken());
  2032.     }
  2033.     virtual LexStream::TokenIndex RightToken()
  2034.     {
  2035.         return (semicolon_token_opt ? semicolon_token_opt : VariableDeclarator(NumVariableDeclarators() - 1) -> RightToken());
  2036.     }
  2037. };
  2038.  
  2039. //
  2040. // Statement --> IfStatement
  2041. //             | WhileStatement
  2042. //             | ForStatement
  2043. //             | Block
  2044. //             | EmptyStatement
  2045. //             | ExpressionStatement
  2046. //             | SwitchStatement
  2047. //             | DoStatement
  2048. //             | BreakStatement
  2049. //             | ContinueStatement
  2050. //             | ReturnStatement
  2051. //             | SynchronizedStatement
  2052. //             | ThrowStatement
  2053. //             | TryStatement
  2054. //
  2055. // Label --> identifier_token
  2056. // 
  2057. // IfStatement --> <IF, Label_opt, if_token, Expression, TrueStatement, FalseStatement_opt>
  2058. // 
  2059. // TrueStatement --> Statement
  2060. // 
  2061. // FalseStatement --> Statement
  2062. // 
  2063. class AstIfStatement : public AstStatement
  2064. {
  2065. public:
  2066.     LexStream::TokenIndex if_token;
  2067.     AstExpression *expression;
  2068.     AstStatement *true_statement;
  2069.     AstStatement *false_statement_opt;
  2070.  
  2071.     AstIfStatement() : expression(NULL)
  2072.     {
  2073.         Ast::kind = Ast::IF;
  2074.         Ast::class_tag = Ast::STATEMENT;
  2075.         Ast::generated = 0;
  2076.         AstStatement::is_reachable = false;
  2077.         AstStatement::can_complete_normally = false;
  2078.     }
  2079.  
  2080.     virtual ~AstIfStatement();
  2081.  
  2082. #ifdef TEST
  2083.     virtual void Print(LexStream &);
  2084. #endif
  2085.  
  2086.     virtual Ast *Clone(StoragePool *);
  2087.  
  2088.     virtual LexStream::TokenIndex LeftToken()
  2089.     {
  2090.         return if_token;
  2091.     }
  2092.     virtual LexStream::TokenIndex RightToken()
  2093.     {
  2094.         return (false_statement_opt ? false_statement_opt -> RightToken()
  2095.                                     : true_statement -> RightToken());
  2096.     }
  2097. };
  2098.  
  2099.  
  2100. //
  2101. // EmptyStatement --> <EMPTY_STATEMENT, Label_opt, ;_token>
  2102. // 
  2103. class AstEmptyStatement : public AstStatement
  2104. {
  2105. public:
  2106.     LexStream::TokenIndex semicolon_token;
  2107.  
  2108.     AstEmptyStatement(LexStream::TokenIndex token_) : semicolon_token(token_)
  2109.     {
  2110.         Ast::kind = Ast::EMPTY_STATEMENT;
  2111.         Ast::class_tag = Ast::STATEMENT;
  2112.         Ast::generated = 0;
  2113.         AstStatement::is_reachable = false;
  2114.         AstStatement::can_complete_normally = false;
  2115.     }
  2116.  
  2117.     virtual ~AstEmptyStatement();
  2118.  
  2119. #ifdef TEST
  2120.     virtual void Print(LexStream &);
  2121. #endif
  2122.  
  2123.     virtual Ast *Clone(StoragePool *);
  2124.  
  2125.     virtual LexStream::TokenIndex LeftToken()
  2126.     {
  2127.         return semicolon_token;
  2128.     }
  2129.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2130. };
  2131.  
  2132.  
  2133. //
  2134. // ExpressionStatement --> <EXPRESSION_STATEMENT, Label_opt, Expression, ;_token_opt>
  2135. // 
  2136. class AstExpressionStatement : public AstStatement
  2137. {
  2138. public:
  2139.     AstExpression *expression;
  2140.     LexStream::TokenIndex semicolon_token_opt;
  2141.  
  2142.     AstExpressionStatement()
  2143.     {
  2144.         Ast::kind = Ast::EXPRESSION_STATEMENT;
  2145.         Ast::class_tag = Ast::STATEMENT;
  2146.         Ast::generated = 0;
  2147.         AstStatement::is_reachable = false;
  2148.         AstStatement::can_complete_normally = false;
  2149.     }
  2150.  
  2151.     virtual ~AstExpressionStatement();
  2152.  
  2153. #ifdef TEST
  2154.     virtual void Print(LexStream &);
  2155. #endif
  2156.  
  2157.     virtual Ast *Clone(StoragePool *);
  2158.  
  2159.     virtual LexStream::TokenIndex LeftToken()
  2160.     {
  2161.         return expression -> LeftToken();
  2162.     }
  2163.     virtual LexStream::TokenIndex RightToken()
  2164.     {
  2165.         return (semicolon_token_opt ? semicolon_token_opt : expression -> RightToken());
  2166.     }
  2167. };
  2168.  
  2169.  
  2170. //
  2171. // SwitchLabel --> CaseLabel
  2172. //               | DefaultLabel
  2173. // 
  2174. // CaseLabel --> <CASE, case_token, Expression, :_token>
  2175. //
  2176. class AstCaseLabel : public Ast
  2177. {
  2178. public:
  2179.     LexStream::TokenIndex case_token;
  2180.     AstExpression *expression;
  2181.     LexStream::TokenIndex colon_token;
  2182.     int map_index;
  2183.  
  2184.     AstCaseLabel()
  2185.     {
  2186.         Ast::kind = Ast::CASE;
  2187.         Ast::class_tag = Ast::NO_TAG;
  2188.         Ast::generated = 0;
  2189.     }
  2190.  
  2191.     virtual ~AstCaseLabel();
  2192.  
  2193. #ifdef TEST
  2194.     virtual void Print(LexStream &);
  2195. #endif
  2196.  
  2197.     virtual Ast *Clone(StoragePool *);
  2198.  
  2199.     virtual LexStream::TokenIndex LeftToken() { return case_token; }
  2200.     virtual LexStream::TokenIndex RightToken() { return colon_token; }
  2201. };
  2202.  
  2203.  
  2204. //
  2205. // DefaultLabel --> <DEFAULT, default_token, :_token>
  2206. // 
  2207. class AstDefaultLabel : public Ast
  2208. {
  2209. public:
  2210.     LexStream::TokenIndex default_token;
  2211.     LexStream::TokenIndex colon_token;
  2212.  
  2213.     AstDefaultLabel()
  2214.     {
  2215.         Ast::kind = Ast::DEFAULT;
  2216.         Ast::class_tag = Ast::NO_TAG;
  2217.         Ast::generated = 0;
  2218.     }
  2219.  
  2220.     virtual ~AstDefaultLabel();
  2221.  
  2222. #ifdef TEST
  2223.     virtual void Print(LexStream &);
  2224. #endif
  2225.  
  2226.     virtual Ast *Clone(StoragePool *);
  2227.  
  2228.     virtual LexStream::TokenIndex LeftToken() { return default_token; }
  2229.     virtual LexStream::TokenIndex RightToken() { return colon_token; }
  2230. };
  2231.  
  2232.  
  2233. // 
  2234. // SwitchBlockStatement --> <SWITCH_BLOCK, SwitchLabels, BlockStatements>
  2235. // 
  2236. class AstSwitchBlockStatement : public Ast
  2237. {
  2238. private:
  2239.     StoragePool *pool;
  2240.  
  2241.     AstArray<AstStatement *> *block_statements;
  2242.     AstArray<Ast *> *switch_labels;
  2243.  
  2244. public:
  2245.  
  2246.     AstSwitchBlockStatement(StoragePool *pool_) : pool(pool_),
  2247.                                                   block_statements(NULL),
  2248.                                                   switch_labels(NULL)
  2249.     {
  2250.         Ast::kind = Ast::SWITCH_BLOCK;
  2251.         Ast::class_tag = Ast::NO_TAG;
  2252.         Ast::generated = 0;
  2253.     }
  2254.  
  2255.     virtual ~AstSwitchBlockStatement();
  2256.  
  2257.     inline AstStatement *&Statement(int i) { return (*block_statements)[i]; }
  2258.     inline int NumStatements() { return (block_statements ? block_statements -> Length() : 0); }
  2259.     inline void AllocateBlockStatements(int estimate = 0);
  2260.     inline void AddStatement(AstStatement *);
  2261.  
  2262.     inline Ast *&SwitchLabel(int i) { return (*switch_labels)[i]; }
  2263.     inline int NumSwitchLabels() { return (switch_labels ? switch_labels -> Length() : 0); }
  2264.     inline void AllocateSwitchLabels(int estimate = 0);
  2265.     inline void AddSwitchLabel(Ast *);
  2266.  
  2267. #ifdef TEST
  2268.     virtual void Print(LexStream &);
  2269. #endif
  2270.  
  2271.     virtual Ast *Clone(StoragePool *);
  2272.  
  2273.     virtual LexStream::TokenIndex LeftToken()
  2274.     {
  2275.         return SwitchLabel(0) -> LeftToken();
  2276.     }
  2277.     virtual LexStream::TokenIndex RightToken()
  2278.     {
  2279.         return Statement(NumStatements() - 1) -> RightToken();
  2280.     }
  2281. };
  2282.  
  2283.  
  2284. class CaseElement
  2285. {
  2286. public:
  2287.     AstSwitchBlockStatement *switch_block_statement;
  2288.     AstExpression *expression;
  2289.     int index;
  2290.  
  2291.     int Value() { return ((IntLiteralValue *) (expression -> value)) -> value; }
  2292.  
  2293.     inline AstStatement *&Statement(int i) { return switch_block_statement -> Statement(i); }
  2294.     inline int NumStatements() { return switch_block_statement -> NumStatements(); }
  2295. };
  2296.  
  2297. //
  2298. // SwitchStatement --> <SWITCH, Label_opt, switch_token, Expression, {_token, SwitchBlockStatements, SwitchLabels_opt, }_token>
  2299. // 
  2300. class AstSwitchStatement : public AstStatement
  2301. {
  2302. public:
  2303.     AstArray<CaseElement *> map;
  2304.     CaseElement default_case;
  2305.  
  2306.     LexStream::TokenIndex switch_token;
  2307.     AstExpression *expression;
  2308.     AstBlock *switch_block;
  2309.  
  2310.     AstSwitchStatement(StoragePool *pool) : map(pool)
  2311.     {
  2312.         Ast::kind = Ast::SWITCH;
  2313.         Ast::class_tag = Ast::STATEMENT;
  2314.         Ast::generated = 0;
  2315.         AstStatement::is_reachable = false;
  2316.         AstStatement::can_complete_normally = false;
  2317.     }
  2318.  
  2319.     virtual ~AstSwitchStatement();
  2320.  
  2321.     void SortCases();
  2322.  
  2323. #ifdef TEST
  2324.     virtual void Print(LexStream &);
  2325. #endif
  2326.  
  2327.     virtual Ast *Clone(StoragePool *);
  2328.  
  2329.     virtual LexStream::TokenIndex LeftToken()
  2330.     {
  2331.         return switch_token;
  2332.     }
  2333.     virtual LexStream::TokenIndex RightToken() { return switch_block -> RightToken(); }
  2334. };
  2335.  
  2336.  
  2337. // 
  2338. // WhileStatement --> <WHILE, Label_opt, while_token, Expression, Statement>
  2339. // 
  2340. class AstWhileStatement : public AstStatement
  2341. {
  2342. public:
  2343.     LexStream::TokenIndex while_token;
  2344.     AstExpression *expression;
  2345.     AstStatement *statement;
  2346.  
  2347.     AstWhileStatement()
  2348.     {
  2349.         Ast::kind = Ast::WHILE;
  2350.         Ast::class_tag = Ast::STATEMENT;
  2351.         Ast::generated = 0;
  2352.         AstStatement::is_reachable = false;
  2353.         AstStatement::can_complete_normally = false;
  2354.     }
  2355.  
  2356.     virtual ~AstWhileStatement();
  2357.  
  2358. #ifdef TEST
  2359.     virtual void Print(LexStream &);
  2360. #endif
  2361.  
  2362.     virtual Ast *Clone(StoragePool *);
  2363.  
  2364.     virtual LexStream::TokenIndex LeftToken()
  2365.     {
  2366.         return while_token;
  2367.     }
  2368.     virtual LexStream::TokenIndex RightToken() { return statement -> RightToken(); }
  2369. };
  2370.  
  2371.  
  2372. // 
  2373. // DoStatement --> <DO, Label_opt, do_token, Expression, Statement, ;_token>
  2374. // 
  2375. class AstDoStatement : public AstStatement
  2376. {
  2377. public:
  2378.     LexStream::TokenIndex do_token;
  2379.     AstStatement *statement;
  2380.     LexStream::TokenIndex while_token;
  2381.     AstExpression *expression;
  2382.     LexStream::TokenIndex semicolon_token;
  2383.  
  2384.     AstDoStatement()
  2385.     {
  2386.         Ast::kind = Ast::DO;
  2387.         Ast::class_tag = Ast::STATEMENT;
  2388.         Ast::generated = 0;
  2389.         AstStatement::is_reachable = false;
  2390.         AstStatement::can_complete_normally = false;
  2391.     }
  2392.  
  2393.     virtual ~AstDoStatement();
  2394.  
  2395. #ifdef TEST
  2396.     virtual void Print(LexStream &);
  2397. #endif
  2398.  
  2399.     virtual Ast *Clone(StoragePool *);
  2400.  
  2401.     virtual LexStream::TokenIndex LeftToken()
  2402.     {
  2403.         return do_token;
  2404.     }
  2405.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2406. };
  2407.  
  2408.  
  2409. // 
  2410. // ForStatement --> <FOR, Label_opt, for_token, ForInits, Expression_opt, ForUpdates, Statement>
  2411. // 
  2412. // ForInit --> ExpressionStatement
  2413. //           | LocalVariableDeclarationStatement
  2414. // 
  2415. // ForUpdate --> ExpressionStatement
  2416. // 
  2417. class AstForStatement : public AstStatement
  2418. {
  2419. private:
  2420.  
  2421.     StoragePool *pool;
  2422.     AstArray<AstStatement *> *for_init_statements;
  2423.     AstArray<AstExpressionStatement *> *for_update_statements;
  2424.  
  2425. public:
  2426.     LexStream::TokenIndex for_token;
  2427.     AstExpression *end_expression_opt;
  2428.     AstStatement *statement;
  2429.  
  2430.     AstForStatement(StoragePool *pool_) : pool(pool_),
  2431.                                           for_init_statements(NULL),
  2432.                                           for_update_statements(NULL)
  2433.     {
  2434.         Ast::kind = Ast::FOR;
  2435.         Ast::class_tag = Ast::STATEMENT;
  2436.         Ast::generated = 0;
  2437.         AstStatement::is_reachable = false;
  2438.         AstStatement::can_complete_normally = false;
  2439.     }
  2440.  
  2441.     virtual ~AstForStatement();
  2442.  
  2443.     inline AstStatement *&ForInitStatement(int i) { return (*for_init_statements)[i]; }
  2444.     inline int NumForInitStatements() { return (for_init_statements ? for_init_statements -> Length() : 0); }
  2445.     inline void AllocateForInitStatements(int estimate = 0);
  2446.     inline void AddForInitStatement(AstStatement *);
  2447.  
  2448.     inline AstExpressionStatement *&ForUpdateStatement(int i) { return (*for_update_statements)[i]; }
  2449.     inline int NumForUpdateStatements() { return (for_update_statements ? for_update_statements -> Length() : 0); }
  2450.     inline void AllocateForUpdateStatements(int estimate = 0);
  2451.     inline void AddForUpdateStatement(AstExpressionStatement *);
  2452.  
  2453. #ifdef TEST
  2454.     virtual void Print(LexStream &);
  2455. #endif
  2456.  
  2457.     virtual Ast *Clone(StoragePool *);
  2458.  
  2459.     virtual LexStream::TokenIndex LeftToken()
  2460.     {
  2461.         return for_token;
  2462.     }
  2463.     virtual LexStream::TokenIndex RightToken() { return statement -> RightToken(); }
  2464. };
  2465.  
  2466.  
  2467. // 
  2468. // BreakStatement --> <BREAK, Label_opt, break_token, identifier_token_opt, ;_token>
  2469. // 
  2470. class AstBreakStatement : public AstStatement
  2471. {
  2472. public:
  2473.     LexStream::TokenIndex break_token;
  2474.     LexStream::TokenIndex identifier_token_opt;
  2475.     LexStream::TokenIndex semicolon_token;
  2476.     int nesting_level;
  2477.  
  2478.     AstBreakStatement()
  2479.     {
  2480.         Ast::kind = Ast::BREAK;
  2481.         Ast::class_tag = Ast::STATEMENT;
  2482.         Ast::generated = 0;
  2483.         AstStatement::is_reachable = false;
  2484.         AstStatement::can_complete_normally = false;
  2485.     }
  2486.  
  2487.     virtual ~AstBreakStatement();
  2488.  
  2489. #ifdef TEST
  2490.     virtual void Print(LexStream &);
  2491. #endif
  2492.  
  2493.     virtual Ast *Clone(StoragePool *);
  2494.  
  2495.     virtual LexStream::TokenIndex LeftToken()
  2496.     {
  2497.         return break_token;
  2498.     }
  2499.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2500. };
  2501.  
  2502. // 
  2503. // ContinueStatement --> <CONTINUE, Label_opt, continue_token, SimpleName_opt, ;_token>
  2504. // 
  2505. class AstContinueStatement : public AstStatement
  2506. {
  2507. public:
  2508.     LexStream::TokenIndex continue_token;
  2509.     LexStream::TokenIndex identifier_token_opt;
  2510.     LexStream::TokenIndex semicolon_token;
  2511.     int nesting_level;
  2512.  
  2513.     AstContinueStatement()
  2514.     {
  2515.         Ast::kind = Ast::CONTINUE;
  2516.         Ast::class_tag = Ast::STATEMENT;
  2517.         Ast::generated = 0;
  2518.         AstStatement::is_reachable = false;
  2519.         AstStatement::can_complete_normally = false;
  2520.     }
  2521.  
  2522.     virtual ~AstContinueStatement();
  2523.  
  2524. #ifdef TEST
  2525.     virtual void Print(LexStream &);
  2526. #endif
  2527.  
  2528.     virtual Ast *Clone(StoragePool *);
  2529.  
  2530.     virtual LexStream::TokenIndex LeftToken()
  2531.     {
  2532.         return continue_token;
  2533.     }
  2534.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2535. };
  2536.  
  2537.  
  2538. // 
  2539. // ReturnStatement --> <RETURN, Label_opt, return_token, Expression_opt, ;_token>
  2540. // 
  2541. class AstReturnStatement : public AstStatement
  2542. {
  2543. public:
  2544.     LexStream::TokenIndex return_token;
  2545.     AstExpression *expression_opt;
  2546.     LexStream::TokenIndex semicolon_token;
  2547.  
  2548.     AstReturnStatement()
  2549.     {
  2550.         Ast::kind = Ast::RETURN;
  2551.         Ast::class_tag = Ast::STATEMENT;
  2552.         Ast::generated = 0;
  2553.         AstStatement::is_reachable = false;
  2554.         AstStatement::can_complete_normally = false;
  2555.     }
  2556.  
  2557.     virtual ~AstReturnStatement();
  2558.  
  2559. #ifdef TEST
  2560.     virtual void Print(LexStream &);
  2561. #endif
  2562.  
  2563.     virtual Ast *Clone(StoragePool *);
  2564.  
  2565.     virtual LexStream::TokenIndex LeftToken()
  2566.     {
  2567.         return return_token;
  2568.     }
  2569.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2570. };
  2571.  
  2572.  
  2573. // 
  2574. // ThrowStatement --> <THROW, Label_opt, throw_token, Expression, ;_token>
  2575. // 
  2576. class AstThrowStatement : public AstStatement
  2577. {
  2578. public:
  2579.     LexStream::TokenIndex throw_token;
  2580.     AstExpression *expression;
  2581.     LexStream::TokenIndex semicolon_token;
  2582.  
  2583.     AstThrowStatement()
  2584.     {
  2585.         Ast::kind = Ast::THROW;
  2586.         Ast::class_tag = Ast::STATEMENT;
  2587.         Ast::generated = 0;
  2588.         AstStatement::is_reachable = false;
  2589.         AstStatement::can_complete_normally = false;
  2590.     }
  2591.  
  2592.     virtual ~AstThrowStatement();
  2593.  
  2594. #ifdef TEST
  2595.     virtual void Print(LexStream &);
  2596. #endif
  2597.  
  2598.     virtual Ast *Clone(StoragePool *);
  2599.  
  2600.     virtual LexStream::TokenIndex LeftToken()
  2601.     {
  2602.         return throw_token;
  2603.     }
  2604.     virtual LexStream::TokenIndex RightToken() { return semicolon_token; }
  2605. };
  2606.  
  2607.  
  2608. // 
  2609. // SynchronizedStatement --> <SYNCHRONIZED_STATEMENT, Label_opt, synchronized_token, Expression, Block>
  2610. // 
  2611. class AstSynchronizedStatement : public AstStatement
  2612. {
  2613. public:
  2614.     LexStream::TokenIndex synchronized_token;
  2615.     AstExpression *expression;
  2616.     AstBlock *block;
  2617.  
  2618.     AstSynchronizedStatement()
  2619.     {
  2620.         Ast::kind = Ast::SYNCHRONIZED_STATEMENT;
  2621.         Ast::class_tag = Ast::STATEMENT;
  2622.         Ast::generated = 0;
  2623.         AstStatement::is_reachable = false;
  2624.         AstStatement::can_complete_normally = false;
  2625.     }
  2626.  
  2627.     virtual ~AstSynchronizedStatement();
  2628.  
  2629. #ifdef TEST
  2630.     virtual void Print(LexStream &);
  2631. #endif
  2632.  
  2633.     virtual Ast *Clone(StoragePool *);
  2634.  
  2635.     virtual LexStream::TokenIndex LeftToken()
  2636.     {
  2637.         return synchronized_token;
  2638.     }
  2639.     virtual LexStream::TokenIndex RightToken() { return block -> RightToken(); }
  2640. };
  2641.  
  2642.  
  2643. // 
  2644. // CatchClause --> <CATCH, catch_token, FormalParameter, Block>
  2645. // 
  2646. class AstCatchClause : public Ast
  2647. {
  2648. public:
  2649.     VariableSymbol *parameter_symbol;
  2650.  
  2651.     LexStream::TokenIndex catch_token;
  2652.     AstFormalParameter *formal_parameter;
  2653.     AstBlock *block;
  2654.  
  2655.     AstCatchClause() : parameter_symbol(NULL)
  2656.     {
  2657.         Ast::kind = Ast::CATCH;
  2658.         Ast::class_tag = Ast::NO_TAG;
  2659.         Ast::generated = 0;
  2660.     }
  2661.  
  2662.     virtual ~AstCatchClause();
  2663.  
  2664. #ifdef TEST
  2665.     virtual void Print(LexStream &);
  2666. #endif
  2667.  
  2668.     virtual Ast *Clone(StoragePool *);
  2669.  
  2670.     virtual LexStream::TokenIndex LeftToken() { return catch_token; }
  2671.     virtual LexStream::TokenIndex RightToken() { return block -> RightToken(); }
  2672. };
  2673.  
  2674.  
  2675. // 
  2676. // FinallyClause --> <FINALLY, finally_token, Block>
  2677. // 
  2678. class AstFinallyClause : public Ast
  2679. {
  2680. public:
  2681.     LexStream::TokenIndex finally_token;
  2682.     AstBlock *block;
  2683.  
  2684.     AstFinallyClause()
  2685.     {
  2686.         Ast::kind = Ast::FINALLY;
  2687.         Ast::class_tag = Ast::NO_TAG;
  2688.         Ast::generated = 0;
  2689.     }
  2690.  
  2691.     virtual ~AstFinallyClause();
  2692.  
  2693. #ifdef TEST
  2694.     virtual void Print(LexStream &);
  2695. #endif
  2696.  
  2697.     virtual Ast *Clone(StoragePool *);
  2698.  
  2699.     virtual LexStream::TokenIndex LeftToken() { return finally_token; }
  2700.     virtual LexStream::TokenIndex RightToken() { return block -> RightToken(); }
  2701. };
  2702.  
  2703.  
  2704. // 
  2705. // TryStatement --> <TRY, Label_opt, try-token, Block CatchClauses, FinallyClause_opt>
  2706. // 
  2707. class AstTryStatement : public AstStatement
  2708. {
  2709. private:
  2710.  
  2711.     StoragePool *pool;
  2712.     AstArray<AstCatchClause *> *catch_clauses;
  2713.  
  2714. public:
  2715.     LexStream::TokenIndex try_token;
  2716.     AstBlock *block;
  2717.     AstFinallyClause *finally_clause_opt;
  2718.  
  2719.     AstTryStatement(StoragePool *pool_) : pool(pool_),
  2720.                                           catch_clauses(NULL)
  2721.     {
  2722.         Ast::kind = Ast::TRY;
  2723.         Ast::class_tag = Ast::STATEMENT;
  2724.         Ast::generated = 0;
  2725.         AstStatement::is_reachable = false;
  2726.         AstStatement::can_complete_normally = false;
  2727.     }
  2728.  
  2729.     virtual ~AstTryStatement();
  2730.  
  2731.     inline AstCatchClause *&CatchClause(int i) { return (*catch_clauses)[i]; }
  2732.     inline int NumCatchClauses() { return (catch_clauses ? catch_clauses -> Length() : 0); }
  2733.     inline void AllocateCatchClauses(int estimate = 0);
  2734.     inline void AddCatchClause(AstCatchClause *);
  2735.  
  2736. #ifdef TEST
  2737.     virtual void Print(LexStream &);
  2738. #endif
  2739.  
  2740.     virtual Ast *Clone(StoragePool *);
  2741.  
  2742.     virtual LexStream::TokenIndex LeftToken()
  2743.     {
  2744.         return try_token;
  2745.     }
  2746.     virtual LexStream::TokenIndex RightToken()
  2747.     {
  2748.         //
  2749.         // when the Finally clause is null, there must be one or more catch clauses
  2750.         //
  2751.         return (finally_clause_opt ? finally_clause_opt -> RightToken() : CatchClause(NumCatchClauses() - 1) -> RightToken());
  2752.     }
  2753. };
  2754.  
  2755. // 
  2756. // Expression --> Primary
  2757. //              | UnaryExpression
  2758. //              | BinaryExpression
  2759. //              | ConditionalExpression
  2760. //              | AssignmentExpression
  2761. // 
  2762. // Primary --> Literal
  2763. //           | NullLiteral
  2764. //           | ThisExpression
  2765. //           | SuperExpression
  2766. //           | ParenthesizedExpression
  2767. //           | ClassInstanceCreationExpression
  2768. //           | ArrayCreationExpression
  2769. //           | FieldAccess
  2770. //           | MethodInvocation
  2771. //           | ArrayAccess
  2772. // 
  2773. // Literal --> IntegerLiteral
  2774. //           | LongLiteral
  2775. //           | FloatingPointLiteral
  2776. //           | DoubleLiteral
  2777. //           | BooleanLiteral
  2778. //           | StringLiteral
  2779. //           | CharacterLiteral
  2780. //
  2781. // BooleanLiteral --> TrueLiteral
  2782. //                  | FalseLiteral
  2783. //
  2784.  
  2785. // 
  2786. // IntegerLiteral --> <INTEGER_LITERAL, integer_literal_token, value>
  2787. // 
  2788. class AstIntegerLiteral : public AstExpression
  2789. {
  2790. public:
  2791.     LexStream::TokenIndex integer_literal_token;
  2792.  
  2793.     AstIntegerLiteral(LexStream::TokenIndex token_) : integer_literal_token(token_)
  2794.     {
  2795.         Ast::kind = Ast::INTEGER_LITERAL;
  2796.         Ast::class_tag = Ast::EXPRESSION;
  2797.         Ast::generated = 0;
  2798.         AstExpression::value = NULL;
  2799.         AstExpression::symbol = NULL;
  2800.     }
  2801.  
  2802.     virtual ~AstIntegerLiteral();
  2803.  
  2804. #ifdef TEST
  2805.     virtual void Print(LexStream &);
  2806. #endif
  2807.  
  2808.     virtual Ast *Clone(StoragePool *);
  2809.  
  2810.     virtual LexStream::TokenIndex LeftToken()  { return integer_literal_token; }
  2811.     virtual LexStream::TokenIndex RightToken() { return integer_literal_token; }
  2812. };
  2813.  
  2814.  
  2815. // 
  2816. // LongLiteral --> <LONG_LITERAL, long_literal_token, value>
  2817. // 
  2818. class AstLongLiteral : public AstExpression
  2819. {
  2820. public:
  2821.     LexStream::TokenIndex long_literal_token;
  2822.  
  2823.     AstLongLiteral(LexStream::TokenIndex token_) : long_literal_token(token_)
  2824.     {
  2825.         Ast::kind = Ast::LONG_LITERAL;
  2826.         Ast::class_tag = Ast::EXPRESSION;
  2827.         Ast::generated = 0;
  2828.         AstExpression::value = NULL;
  2829.         AstExpression::symbol = NULL;
  2830.     }
  2831.  
  2832.     virtual ~AstLongLiteral();
  2833.  
  2834. #ifdef TEST
  2835.     virtual void Print(LexStream &);
  2836. #endif
  2837.  
  2838.     virtual Ast *Clone(StoragePool *);
  2839.  
  2840.     virtual LexStream::TokenIndex LeftToken()  { return long_literal_token; }
  2841.     virtual LexStream::TokenIndex RightToken() { return long_literal_token; }
  2842. };
  2843.  
  2844.  
  2845. //
  2846. // FloatingPointLiteral --> <FLOATING_POINT_LITERAL, Literal, value>
  2847. // 
  2848. class AstFloatingPointLiteral : public AstExpression
  2849. {
  2850. public:
  2851.     LexStream::TokenIndex floating_point_literal_token;
  2852.  
  2853.     AstFloatingPointLiteral(LexStream::TokenIndex token_) : floating_point_literal_token(token_)
  2854.     {
  2855.         Ast::kind = Ast::FLOATING_POINT_LITERAL;
  2856.         Ast::class_tag = Ast::EXPRESSION;
  2857.         Ast::generated = 0;
  2858.         AstExpression::value = NULL;
  2859.         AstExpression::symbol = NULL;
  2860.     }
  2861.  
  2862.     virtual ~AstFloatingPointLiteral();
  2863.  
  2864. #ifdef TEST
  2865.     virtual void Print(LexStream &);
  2866. #endif
  2867.  
  2868.     virtual Ast *Clone(StoragePool *);
  2869.  
  2870.     virtual LexStream::TokenIndex LeftToken()  { return floating_point_literal_token; }
  2871.     virtual LexStream::TokenIndex RightToken() { return floating_point_literal_token; }
  2872. };
  2873.  
  2874. //
  2875. // DoubleLiteral --> <DOUBLE_LITERAL, Literal, value>
  2876. // 
  2877. class AstDoubleLiteral : public AstExpression
  2878. {
  2879. public:
  2880.     LexStream::TokenIndex double_literal_token;
  2881.  
  2882.     AstDoubleLiteral(LexStream::TokenIndex token_) : double_literal_token(token_)
  2883.     {
  2884.         Ast::kind = Ast::DOUBLE_LITERAL;
  2885.         Ast::class_tag = Ast::EXPRESSION;
  2886.         Ast::generated = 0;
  2887.         AstExpression::value = NULL;
  2888.         AstExpression::symbol = NULL;
  2889.     }
  2890.  
  2891.     virtual ~AstDoubleLiteral();
  2892.  
  2893. #ifdef TEST
  2894.     virtual void Print(LexStream &);
  2895. #endif
  2896.  
  2897.     virtual Ast *Clone(StoragePool *);
  2898.  
  2899.     virtual LexStream::TokenIndex LeftToken()  { return double_literal_token; }
  2900.     virtual LexStream::TokenIndex RightToken() { return double_literal_token; }
  2901. };
  2902.  
  2903. //
  2904. // TrueLiteral --> <TRUE_LITERAL, Literal, value>
  2905. //
  2906. class AstTrueLiteral : public AstExpression
  2907. {
  2908. public:
  2909.     LexStream::TokenIndex true_literal_token;
  2910.  
  2911.     AstTrueLiteral(LexStream::TokenIndex token_) : true_literal_token(token_)
  2912.     {
  2913.         Ast::kind = Ast::TRUE_LITERAL;
  2914.         Ast::class_tag = Ast::EXPRESSION;
  2915.         Ast::generated = 0;
  2916.         AstExpression::value = NULL;
  2917.         AstExpression::symbol = NULL;
  2918.     }
  2919.  
  2920.     virtual ~AstTrueLiteral();
  2921.  
  2922. #ifdef TEST
  2923.     virtual void Print(LexStream &);
  2924. #endif
  2925.  
  2926.     virtual Ast *Clone(StoragePool *);
  2927.  
  2928.     virtual LexStream::TokenIndex LeftToken()  { return true_literal_token; }
  2929.     virtual LexStream::TokenIndex RightToken() { return true_literal_token; }
  2930. };
  2931.  
  2932. //
  2933. // FalseLiteral --> <FALSE_LITERAL, Literal, value>
  2934. //
  2935. class AstFalseLiteral : public AstExpression
  2936. {
  2937. public:
  2938.     LexStream::TokenIndex false_literal_token;
  2939.  
  2940.     AstFalseLiteral(LexStream::TokenIndex token_) : false_literal_token(token_)
  2941.     {
  2942.         Ast::kind = Ast::FALSE_LITERAL;
  2943.         Ast::class_tag = Ast::EXPRESSION;
  2944.         Ast::generated = 0;
  2945.         AstExpression::value = NULL;
  2946.         AstExpression::symbol = NULL;
  2947.     }
  2948.  
  2949.     virtual ~AstFalseLiteral();
  2950.  
  2951. #ifdef TEST
  2952.     virtual void Print(LexStream &);
  2953. #endif
  2954.  
  2955.     virtual Ast *Clone(StoragePool *);
  2956.  
  2957.     virtual LexStream::TokenIndex LeftToken()  { return false_literal_token; }
  2958.     virtual LexStream::TokenIndex RightToken() { return false_literal_token; }
  2959. };
  2960.  
  2961. //
  2962. // StringLiteral --> <STRING_LITERAL, Literal, value>
  2963. //
  2964. class AstStringLiteral : public AstExpression
  2965. {
  2966. public:
  2967.     LexStream::TokenIndex string_literal_token;
  2968.  
  2969.     AstStringLiteral(LexStream::TokenIndex token_) : string_literal_token(token_)
  2970.     {
  2971.         Ast::kind = Ast::STRING_LITERAL;
  2972.         Ast::class_tag = Ast::EXPRESSION;
  2973.         Ast::generated = 0;
  2974.         AstExpression::value = NULL;
  2975.         AstExpression::symbol = NULL;
  2976.     }
  2977.  
  2978.     virtual ~AstStringLiteral();
  2979.  
  2980. #ifdef TEST
  2981.     virtual void Print(LexStream &);
  2982. #endif
  2983.  
  2984.     virtual Ast *Clone(StoragePool *);
  2985.  
  2986.     virtual LexStream::TokenIndex LeftToken()  { return string_literal_token; }
  2987.     virtual LexStream::TokenIndex RightToken() { return string_literal_token; }
  2988. };
  2989.  
  2990. // 
  2991. // CharacterLiteral --> <CHARACTER_LITERAL, literal_token, value>
  2992. // 
  2993. class AstCharacterLiteral : public AstExpression
  2994. {
  2995. public:
  2996.     LexStream::TokenIndex character_literal_token;
  2997.  
  2998.     AstCharacterLiteral(LexStream::TokenIndex token_) : character_literal_token(token_)
  2999.     {
  3000.         Ast::kind = Ast::CHARACTER_LITERAL;
  3001.         Ast::class_tag = Ast::EXPRESSION;
  3002.         Ast::generated = 0;
  3003.         AstExpression::value = NULL;
  3004.         AstExpression::symbol = NULL;
  3005.     }
  3006.  
  3007.     virtual ~AstCharacterLiteral();
  3008.  
  3009. #ifdef TEST
  3010.     virtual void Print(LexStream &);
  3011. #endif
  3012.  
  3013.     virtual Ast *Clone(StoragePool *);
  3014.  
  3015.     virtual LexStream::TokenIndex LeftToken()  { return character_literal_token; }
  3016.     virtual LexStream::TokenIndex RightToken() { return character_literal_token; }
  3017. };
  3018.  
  3019. // 
  3020. // NullLiteral --> <NULL_EXPRESSION, null_token>
  3021. // 
  3022. class AstNullLiteral : public AstExpression
  3023. {
  3024. public:
  3025.     LexStream::TokenIndex null_token;
  3026.  
  3027.     AstNullLiteral(LexStream::TokenIndex token_) : null_token(token_)
  3028.     {
  3029.         Ast::kind = Ast::NULL_LITERAL;
  3030.         Ast::class_tag = Ast::EXPRESSION;
  3031.         Ast::generated = 0;
  3032.         AstExpression::value = NULL;
  3033.         AstExpression::symbol = NULL;
  3034.     }
  3035.  
  3036.     virtual ~AstNullLiteral();
  3037.  
  3038. #ifdef TEST
  3039.     virtual void Print(LexStream &);
  3040. #endif
  3041.  
  3042.     virtual Ast *Clone(StoragePool *);
  3043.  
  3044.     virtual LexStream::TokenIndex LeftToken()  { return null_token; }
  3045.     virtual LexStream::TokenIndex RightToken() { return null_token; }
  3046. };
  3047.  
  3048. // 
  3049. // ThisExpression --> <THIS, this_token>
  3050. //
  3051. class AstThisExpression : public AstExpression
  3052. {
  3053. public:
  3054.     LexStream::TokenIndex this_token;
  3055.  
  3056.     AstThisExpression(LexStream::TokenIndex token_) : this_token(token_)
  3057.     {
  3058.         Ast::kind = Ast::THIS_EXPRESSION;
  3059.         Ast::class_tag = Ast::EXPRESSION;
  3060.         Ast::generated = 0;
  3061.         AstExpression::value = NULL;
  3062.         AstExpression::symbol = NULL;
  3063.     }
  3064.  
  3065.     virtual ~AstThisExpression();
  3066.  
  3067. #ifdef TEST
  3068.     virtual void Print(LexStream &);
  3069. #endif
  3070.  
  3071.     virtual Ast *Clone(StoragePool *);
  3072.  
  3073.     virtual LexStream::TokenIndex LeftToken()  { return this_token; }
  3074.     virtual LexStream::TokenIndex RightToken() { return this_token; }
  3075. };
  3076.  
  3077.  
  3078. //
  3079. // SuperExpression --> <SUPER, super_token>
  3080. //
  3081. class AstSuperExpression : public AstExpression
  3082. {
  3083. public:
  3084.     LexStream::TokenIndex super_token;
  3085.  
  3086.     AstSuperExpression(LexStream::TokenIndex token_) : super_token(token_)
  3087.     {
  3088.         Ast::kind = Ast::SUPER_EXPRESSION;
  3089.         Ast::class_tag = Ast::EXPRESSION;
  3090.         Ast::generated = 0;
  3091.         AstExpression::value = NULL;
  3092.         AstExpression::symbol = NULL;
  3093.     }
  3094.  
  3095.     virtual ~AstSuperExpression();
  3096.  
  3097. #ifdef TEST
  3098.     virtual void Print(LexStream &);
  3099. #endif
  3100.  
  3101.     virtual Ast *Clone(StoragePool *);
  3102.  
  3103.     virtual LexStream::TokenIndex LeftToken()  { return super_token; }
  3104.     virtual LexStream::TokenIndex RightToken() { return super_token; }
  3105. };
  3106.  
  3107.  
  3108. // 
  3109. // ParenthesizedExpression --> <PARENTHESIZED_EXPRESSION, (_token, Expression, )_token>
  3110. // 
  3111. class AstParenthesizedExpression : public AstExpression
  3112. {
  3113. public:
  3114.     LexStream::TokenIndex left_parenthesis_token;
  3115.     AstExpression *expression;
  3116.     LexStream::TokenIndex right_parenthesis_token;
  3117.  
  3118.     AstParenthesizedExpression()
  3119.     {
  3120.         Ast::kind = Ast::PARENTHESIZED_EXPRESSION;
  3121.         Ast::class_tag = Ast::EXPRESSION;
  3122.         Ast::generated = 0;
  3123.         AstExpression::value = NULL;
  3124.         AstExpression::symbol = NULL;
  3125.     }
  3126.  
  3127.     virtual ~AstParenthesizedExpression();
  3128.  
  3129. #ifdef TEST
  3130.     virtual void Print(LexStream &);
  3131. #endif
  3132.  
  3133.     virtual Ast *Clone(StoragePool *);
  3134.  
  3135.     virtual LexStream::TokenIndex LeftToken()  { return left_parenthesis_token; }
  3136.     virtual LexStream::TokenIndex RightToken() { return right_parenthesis_token; }
  3137. };
  3138.  
  3139.  
  3140. //
  3141. // TypeExpression --> <TYPE, Type>
  3142. // 
  3143. class AstTypeExpression : public AstExpression
  3144. {
  3145. public:
  3146.     Ast *type;
  3147.  
  3148.     AstTypeExpression(Ast *type_) : type(type_)
  3149.     {
  3150.         Ast::kind = Ast::TYPE;
  3151.         Ast::class_tag = Ast::EXPRESSION;
  3152.         Ast::generated = 0;
  3153.         AstExpression::value = NULL;
  3154.         AstExpression::symbol = NULL;
  3155.     }
  3156.  
  3157.     virtual ~AstTypeExpression();
  3158.  
  3159. #ifdef TEST
  3160.     virtual void Print(LexStream &);
  3161. #endif
  3162.  
  3163.     virtual Ast *Clone(StoragePool *);
  3164.  
  3165.     virtual LexStream::TokenIndex LeftToken()  { return type -> LeftToken(); }
  3166.     virtual LexStream::TokenIndex RightToken() { return type -> RightToken(); }
  3167. };
  3168.  
  3169.  
  3170. //
  3171. // ClassInstanceCreationExpression --> <CLASS_CREATION, new_token, TypeExpression, (_token, Arguments, )_token>
  3172. //
  3173. // Sometimes, during semantic analysis an artificial base_opt expression is constructed.
  3174. // In such a case, the user can determine this condition by testing whether or not
  3175. // dot_token_opt is 0;
  3176. //
  3177. class AstClassInstanceCreationExpression : public AstExpression
  3178. {
  3179. private:
  3180.  
  3181.     StoragePool *pool;
  3182.     AstArray<AstExpression *> *arguments;
  3183.     AstArray<AstExpression *> *local_arguments_opt; // used only for local classes that use enclosed local variables
  3184.  
  3185. public:
  3186.     AstExpression *base_opt;
  3187.     LexStream::TokenIndex dot_token_opt;
  3188.     LexStream::TokenIndex new_token;
  3189.     AstTypeExpression *class_type;
  3190.     LexStream::TokenIndex left_parenthesis_token;
  3191.     LexStream::TokenIndex right_parenthesis_token;
  3192.     AstClassBody *class_body_opt;
  3193.  
  3194.     AstClassInstanceCreationExpression(StoragePool *pool_) : pool(pool_),
  3195.                                                              arguments(NULL),
  3196.                                                              local_arguments_opt(NULL)
  3197.     {
  3198.         Ast::kind = Ast::CLASS_CREATION;
  3199.         Ast::class_tag = Ast::EXPRESSION;
  3200.         Ast::generated = 0;
  3201.         AstExpression::value = NULL;
  3202.         AstExpression::symbol = NULL;
  3203.     }
  3204.  
  3205.     virtual ~AstClassInstanceCreationExpression();
  3206.  
  3207.     inline AstExpression *&Argument(int i) { return (*arguments)[i]; }
  3208.     inline int NumArguments() { return (arguments ? arguments -> Length() : 0); }
  3209.     inline void AllocateArguments(int estimate = 0);
  3210.     inline void AddArgument(AstExpression *);
  3211.  
  3212.     inline AstExpression *&LocalArgument(int i) { return (*local_arguments_opt)[i]; }
  3213.     inline int NumLocalArguments() { return (local_arguments_opt ? local_arguments_opt -> Length() : 0); }
  3214.     inline void AllocateLocalArguments(int estimate = 0);
  3215.     inline void AddLocalArgument(AstExpression *);
  3216.  
  3217. #ifdef TEST
  3218.     virtual void Print(LexStream &);
  3219. #endif
  3220.  
  3221.     virtual Ast *Clone(StoragePool *);
  3222.  
  3223.     virtual LexStream::TokenIndex LeftToken()
  3224.     {
  3225.         return (base_opt ? base_opt -> LeftToken() : new_token);
  3226.     }
  3227.     virtual LexStream::TokenIndex RightToken() { return (class_body_opt ? class_body_opt -> RightToken() : right_parenthesis_token); }
  3228. };
  3229.  
  3230.  
  3231. //
  3232. // DimExpr --> <DIM, [_token, Expression, ]_token>
  3233. //
  3234. class AstDimExpr : public Ast
  3235. {
  3236. public:
  3237.     LexStream::TokenIndex left_bracket_token;
  3238.     AstExpression *expression;
  3239.     LexStream::TokenIndex right_bracket_token;
  3240.  
  3241.     AstDimExpr()
  3242.     {
  3243.         Ast::kind = Ast::DIM;
  3244.         Ast::class_tag = Ast::NO_TAG;
  3245.         Ast::generated = 0;
  3246.     }
  3247.  
  3248.     virtual ~AstDimExpr();
  3249.  
  3250. #ifdef TEST
  3251.     virtual void Print(LexStream &);
  3252. #endif
  3253.  
  3254.     virtual Ast *Clone(StoragePool *);
  3255.  
  3256.     virtual LexStream::TokenIndex LeftToken()  { return left_bracket_token; }
  3257.     virtual LexStream::TokenIndex RightToken() { return right_bracket_token; }
  3258. };
  3259.  
  3260.  
  3261. //
  3262. // ArrayCreationExpression --> <ARRAY_CREATION, new_token, Type, DimExprs, Brackets>
  3263. //
  3264. class AstArrayCreationExpression : public AstExpression
  3265. {
  3266. private:
  3267.  
  3268.     StoragePool *pool;
  3269.     AstArray<AstBrackets *> *brackets;
  3270.     AstArray<AstDimExpr *> *dim_exprs;
  3271.  
  3272. public:
  3273.     LexStream::TokenIndex new_token;
  3274.     Ast *array_type;
  3275.     AstArrayInitializer *array_initializer_opt;
  3276.  
  3277.     AstArrayCreationExpression(StoragePool *pool_) : pool(pool_),
  3278.                                                      brackets(NULL),
  3279.                                                      dim_exprs(NULL)
  3280.     {
  3281.         Ast::kind = Ast::ARRAY_CREATION;
  3282.         Ast::class_tag = Ast::EXPRESSION;
  3283.         Ast::generated = 0;
  3284.         AstExpression::value = NULL;
  3285.         AstExpression::symbol = NULL;
  3286.     }
  3287.  
  3288.     virtual ~AstArrayCreationExpression();
  3289.  
  3290.     inline AstBrackets *&Brackets(int i) { return (*brackets)[i]; }
  3291.     inline int NumBrackets() { return (brackets ? brackets -> Length() : 0); }
  3292.     inline void AllocateBrackets(int estimate = 0);
  3293.     inline void AddBrackets(AstBrackets *);
  3294.  
  3295.     inline AstDimExpr *&DimExpr(int i) { return (*dim_exprs)[i]; }
  3296.     inline int NumDimExprs() { return (dim_exprs ? dim_exprs -> Length() : 0); }
  3297.     inline void AllocateDimExprs(int estimate = 0);
  3298.     inline void AddDimExpr(AstDimExpr *);
  3299.  
  3300. #ifdef TEST
  3301.     virtual void Print(LexStream &);
  3302. #endif
  3303.  
  3304.     virtual Ast *Clone(StoragePool *);
  3305.  
  3306.     virtual LexStream::TokenIndex LeftToken()  { return new_token; }
  3307.     virtual LexStream::TokenIndex RightToken()
  3308.     {
  3309.         return (array_initializer_opt ? array_initializer_opt -> RightToken()
  3310.                                       : (NumBrackets() > 0 ? Brackets(NumBrackets() - 1) -> RightToken()
  3311.                                                            : DimExpr(NumDimExprs() - 1) -> RightToken()));
  3312.     }
  3313. };
  3314.  
  3315.  
  3316. //
  3317. // FieldAccess --> <DOT, Base, ._token, SimpleName>
  3318. //               | <DOT, TypeExpression, ._token, class_token>
  3319. //               | <DOT, TypeExpression, ._token, this_token>
  3320. //
  3321. // SuperField --> <DOT, TypeExpression, ._token, super_token>
  3322. // 
  3323. // Base --> Primary
  3324. //        | Name
  3325. //
  3326. class AstFieldAccess : public AstExpression
  3327. {
  3328. public:
  3329.     enum FieldAccessTag
  3330.     {
  3331.         NONE,
  3332.         CLASS_TAG,
  3333.         THIS_TAG,
  3334.         SUPER_TAG,
  3335.  
  3336.         _num_kinds
  3337.     };
  3338.  
  3339.     AstExpression *base;
  3340.     LexStream::TokenIndex dot_token;
  3341.     LexStream::TokenIndex identifier_token;
  3342.  
  3343.     //
  3344.     // When the right-side of a field access consists of
  3345.     // the keyword this, we resolve it either into a
  3346.     // "this" expression if it refers to "this" type or
  3347.     // to a method call that gives access to the relevant
  3348.     // (private) this$0.
  3349.     //
  3350.     // If the base expression of FieldAccess expression is
  3351.     // of the form expr.this.X, where X is a private variable
  3352.     // that is a member of an outer class, then we resolve it
  3353.     // into a method call to the read_mehod that gives access
  3354.     // to X. In some cases, we also need to resolve field accesses
  3355.     // of the form expr.class.
  3356.     //
  3357.     AstExpression *resolution_opt;
  3358.  
  3359.     AstFieldAccess(FieldAccessTag tag = NONE) : field_access_tag(tag),
  3360.                                                 resolution_opt(NULL)
  3361.     {
  3362.         Ast::kind = Ast::DOT;
  3363.         Ast::class_tag = Ast::EXPRESSION;
  3364.         Ast::generated = 0;
  3365.         AstExpression::value = NULL;
  3366.         AstExpression::symbol = NULL;
  3367.     }
  3368.  
  3369.     virtual ~AstFieldAccess();
  3370.  
  3371.     bool IsNameAccess()  { return field_access_tag == NONE; }
  3372.     bool IsThisAccess()  { return field_access_tag == THIS_TAG; }
  3373.     bool IsSuperAccess() { return field_access_tag == SUPER_TAG; }
  3374.     bool IsClassAccess() { return field_access_tag == CLASS_TAG; }
  3375.  
  3376. #ifdef TEST
  3377.     virtual void Print(LexStream &);
  3378. #endif
  3379.  
  3380.     virtual Ast *Clone(StoragePool *);
  3381.  
  3382.     virtual LexStream::TokenIndex LeftToken()  { return base -> LeftToken(); }
  3383.     virtual LexStream::TokenIndex RightToken() { return identifier_token; }
  3384.  
  3385. private:
  3386.     FieldAccessTag field_access_tag;
  3387. };
  3388.  
  3389.  
  3390. //
  3391. // MethodInvocation --> <CALL, Method, (_token, Arguments, )_token>
  3392. // 
  3393. // Method --> SimpleName
  3394. //          | FieldAccess
  3395. //
  3396. class AstMethodInvocation : public AstExpression
  3397. {
  3398. private:
  3399.  
  3400.     StoragePool *pool;
  3401.     AstArray<AstExpression *> *arguments;
  3402.  
  3403. public:
  3404.     AstExpression *method;
  3405.     LexStream::TokenIndex left_parenthesis_token;
  3406.     LexStream::TokenIndex right_parenthesis_token;
  3407.  
  3408.     AstMethodInvocation(StoragePool *pool_) : pool(pool_),
  3409.                                               arguments(NULL)
  3410.     {
  3411.         Ast::kind = Ast::CALL;
  3412.         Ast::class_tag = Ast::EXPRESSION;
  3413.         Ast::generated = 0;
  3414.         AstExpression::value = NULL;
  3415.         AstExpression::symbol = NULL;
  3416.     }
  3417.  
  3418.     virtual ~AstMethodInvocation();
  3419.  
  3420.     inline AstExpression *&Argument(int i) { return (*arguments)[i]; }
  3421.     inline int NumArguments() { return (arguments ? arguments -> Length() : 0); }
  3422.     inline void AllocateArguments(int estimate = 0);
  3423.     inline void AddArgument(AstExpression *);
  3424.  
  3425. #ifdef TEST
  3426.     virtual void Print(LexStream &);
  3427. #endif
  3428.  
  3429.     virtual Ast *Clone(StoragePool *);
  3430.  
  3431.     virtual LexStream::TokenIndex LeftToken() { return method -> LeftToken(); }
  3432.     virtual LexStream::TokenIndex RightToken() { return right_parenthesis_token; }
  3433. };
  3434.  
  3435.  
  3436. // 
  3437. // ArrayAccess --> <ARRAY_ACCESS, Base, [_token, Expression, ]_token>
  3438. //
  3439. class AstArrayAccess : public AstExpression
  3440. {
  3441. public:
  3442.     AstExpression *base;
  3443.     LexStream::TokenIndex left_bracket_token;
  3444.     AstExpression *expression;
  3445.     LexStream::TokenIndex right_bracket_token;
  3446.  
  3447.     AstArrayAccess()
  3448.     {
  3449.         Ast::kind = Ast::ARRAY_ACCESS;
  3450.         Ast::class_tag = Ast::EXPRESSION;
  3451.         Ast::generated = 0;
  3452.         AstExpression::value = NULL;
  3453.         AstExpression::symbol = NULL;
  3454.     }
  3455.  
  3456.     virtual ~AstArrayAccess();
  3457.  
  3458. #ifdef TEST
  3459.     virtual void Print(LexStream &);
  3460. #endif
  3461.  
  3462.     virtual Ast *Clone(StoragePool *);
  3463.  
  3464.     virtual LexStream::TokenIndex LeftToken() { return base -> LeftToken(); }
  3465.     virtual LexStream::TokenIndex RightToken() { return right_bracket_token; }
  3466. };
  3467.  
  3468.  
  3469. //
  3470. // UnaryExpression --> PreUnaryExpression
  3471. //                   | PostUnaryExpression
  3472. //                   | CastExpression
  3473. // 
  3474. // PostUnaryExpression --> <POST_UNARY, PostUnaryTag, Expression, PostOperator>
  3475. // 
  3476. // PostUnaryTag --> PLUSPLUS | MINUSMINUS
  3477. // 
  3478. // PostOperator --> ++_token | --_token
  3479. //
  3480. class AstPostUnaryExpression : public AstExpression
  3481. {
  3482. public:
  3483.     enum PostUnaryExpressionTag
  3484.     {
  3485.         NONE,
  3486.         PLUSPLUS,
  3487.         MINUSMINUS,
  3488.  
  3489.         _num_kinds
  3490.     };
  3491.  
  3492.     PostUnaryExpressionTag post_unary_tag;
  3493.     AstExpression *expression;
  3494.     LexStream::TokenIndex post_operator_token;
  3495.  
  3496.     //
  3497.     // When the left-hand side of an assignment is a name that refers
  3498.     // to a private field in an enclosing scope, the access method
  3499.     // that gives write-permission to that field is recorded here.
  3500.     //
  3501.     MethodSymbol *write_method;
  3502.  
  3503.     AstPostUnaryExpression(PostUnaryExpressionTag tag_) : post_unary_tag(tag_),
  3504.                                                           write_method(NULL)
  3505.     {
  3506.         Ast::kind = Ast::POST_UNARY;
  3507.         Ast::class_tag = Ast::EXPRESSION;
  3508.         Ast::generated = 0;
  3509.         AstExpression::value = NULL;
  3510.         AstExpression::symbol = NULL;
  3511.     }
  3512.  
  3513.     virtual ~AstPostUnaryExpression();
  3514.  
  3515. #ifdef TEST
  3516.     virtual void Print(LexStream &);
  3517. #endif
  3518.  
  3519.     virtual Ast *Clone(StoragePool *);
  3520.  
  3521.     virtual LexStream::TokenIndex LeftToken()  { return expression -> LeftToken(); }
  3522.     virtual LexStream::TokenIndex RightToken() { return post_operator_token; }
  3523. };
  3524.  
  3525.  
  3526. //
  3527. // PreUnaryExpression -->  <PRE_UNARY, PreUnaryTag, PreOperator, Expression>
  3528. // 
  3529. // PreUnaryTag --> PLUS | MINUS | TWIDDLE | NOT | PLUSPLUS | MINUSMINUS
  3530. // 
  3531. // PreOperator --> +_token | -_token | ~_token | !_token | ++_token | --_token
  3532. // 
  3533. class AstPreUnaryExpression : public AstExpression
  3534. {
  3535. public:
  3536.     enum PreUnaryExpressionTag
  3537.     {
  3538.         NONE,
  3539.         PLUSPLUS,
  3540.         MINUSMINUS,
  3541.         PLUS,
  3542.         MINUS,
  3543.         TWIDDLE,
  3544.         NOT,
  3545.  
  3546.         _num_kinds
  3547.     };
  3548.  
  3549.     PreUnaryExpressionTag pre_unary_tag;
  3550.     LexStream::TokenIndex pre_operator_token;
  3551.     AstExpression *expression;
  3552.  
  3553.     //
  3554.     // When the left-hand side of an assignment is a name that refers
  3555.     // to a private field in an enclosing scope, the access method
  3556.     // that gives write-permission to that field is recorded here.
  3557.     //
  3558.     MethodSymbol *write_method;
  3559.  
  3560.     AstPreUnaryExpression(PreUnaryExpressionTag tag_) : pre_unary_tag(tag_),
  3561.                                                         write_method(NULL)
  3562.     {
  3563.         Ast::kind = Ast::PRE_UNARY;
  3564.         Ast::class_tag = Ast::EXPRESSION;
  3565.         Ast::generated = 0;
  3566.         AstExpression::value = NULL;
  3567.         AstExpression::symbol = NULL;
  3568.     }
  3569.  
  3570.     virtual ~AstPreUnaryExpression();
  3571.  
  3572. #ifdef TEST
  3573.     virtual void Print(LexStream &);
  3574. #endif
  3575.  
  3576.     virtual Ast *Clone(StoragePool *);
  3577.  
  3578.     virtual LexStream::TokenIndex LeftToken()  { return pre_operator_token; }
  3579.     virtual LexStream::TokenIndex RightToken() { return expression -> RightToken(); }
  3580. };
  3581.  
  3582.  
  3583. //
  3584. // CastExpression --> <cAstkind, (_token_opt, Type_opt, Brackets )_token_opt, Expression>
  3585. //
  3586. // cAstkind --> CAST
  3587. //             | CHECK_AND_CAST
  3588. //
  3589. // NOTE that the optional symbols above are absent only when the compiler inserts
  3590. // a CAST conversion node into the program.
  3591. //
  3592. class AstCastExpression : public AstExpression
  3593. {
  3594. private:
  3595.  
  3596.     StoragePool *pool;
  3597.     AstArray<AstBrackets *> *brackets;
  3598.  
  3599. public:
  3600.     LexStream::TokenIndex left_parenthesis_token_opt;
  3601.     Ast *type_opt;
  3602.     LexStream::TokenIndex right_parenthesis_token_opt;
  3603.     AstExpression *expression;
  3604.  
  3605.     AstCastExpression(StoragePool *pool_) : pool(pool_),
  3606.                                             brackets(NULL)
  3607.     {
  3608.         Ast::kind = Ast::CAST;
  3609.         Ast::class_tag = Ast::EXPRESSION;
  3610.         Ast::generated = 0;
  3611.         AstExpression::value = NULL;
  3612.         AstExpression::symbol = NULL;
  3613.     }
  3614.  
  3615.     virtual ~AstCastExpression();
  3616.  
  3617.     inline AstBrackets *&Brackets(int i) { return (*brackets)[i]; }
  3618.     inline int NumBrackets() { return (brackets ? brackets -> Length() : 0); }
  3619.     inline void AllocateBrackets(int estimate = 0);
  3620.     inline void AddBrackets(AstBrackets *);
  3621.  
  3622. #ifdef TEST
  3623.     virtual void Print(LexStream &);
  3624. #endif
  3625.  
  3626.     virtual Ast *Clone(StoragePool *);
  3627.  
  3628.     virtual LexStream::TokenIndex LeftToken()
  3629.     {
  3630.         return (left_parenthesis_token_opt ? left_parenthesis_token_opt : expression -> LeftToken());
  3631.     }
  3632.     virtual LexStream::TokenIndex RightToken() { return expression -> RightToken(); }
  3633. };
  3634.  
  3635.  
  3636. // 
  3637. // BinaryExpression --> <BINARY, BinaryTag, LeftExpression, BinaryOperator, RightExpression>
  3638. // 
  3639. // LeftExpression --> Expression
  3640. // 
  3641. // RightExpression --> Expression
  3642. //                   | type
  3643. //
  3644. // BinaryTag --> STAR | SLASH | MOD | PLUS | MINUS | LEFT_SHIFT | RIGHT_SHIFT | UNSIGNED_RIGHT_SHIFT |
  3645. //               INSTANCEOF | LESS | GREATER | LESS_EQUAL | GREATER_EQUAL | EQUAL_EQUAL | NOT_EQUAL |
  3646. //               AND | XOR | IOR | AND_AND | OR_OR
  3647. //
  3648. // BinaryOperator --> *_token | /_token | %_token | +_token | -_token | <<_token | >>_token | >>>_token |
  3649. //                    instanceof_token | <_token | >_token | <=_token | >=_token | ==_token | !=_token |
  3650. //                    &_token | ^_token | |_token | &&_token | ||_token
  3651. // 
  3652. class AstBinaryExpression : public AstExpression
  3653. {
  3654. public:
  3655.     enum BinaryExpressionTag
  3656.     {
  3657.         NONE,
  3658.         STAR,
  3659.         SLASH,
  3660.         MOD,
  3661.         PLUS,
  3662.         MINUS,
  3663.         LEFT_SHIFT,
  3664.         RIGHT_SHIFT,
  3665.         UNSIGNED_RIGHT_SHIFT,
  3666.         INSTANCEOF,
  3667.         LESS,
  3668.         GREATER,
  3669.         AND,
  3670.         XOR,
  3671.         IOR,
  3672.         AND_AND,
  3673.         OR_OR,
  3674.  
  3675.         LESS_EQUAL,
  3676.         GREATER_EQUAL,
  3677.         EQUAL_EQUAL,
  3678.         NOT_EQUAL,
  3679.  
  3680.         _num_kinds
  3681.     };
  3682.  
  3683.     BinaryExpressionTag binary_tag;
  3684.     AstExpression *left_expression;
  3685.     LexStream::TokenIndex binary_operator_token;
  3686.     AstExpression *right_expression;
  3687.  
  3688.     AstBinaryExpression(BinaryExpressionTag tag_) : binary_tag(tag_)
  3689.     {
  3690.         Ast::kind = Ast::BINARY;
  3691.         Ast::class_tag = Ast::EXPRESSION;
  3692.         Ast::generated = 0;
  3693.         AstExpression::value = NULL;
  3694.         AstExpression::symbol = NULL;
  3695.     }
  3696.  
  3697.     virtual ~AstBinaryExpression();
  3698.  
  3699. #ifdef TEST
  3700.     virtual void Print(LexStream &);
  3701. #endif
  3702.  
  3703.     virtual Ast *Clone(StoragePool *);
  3704.  
  3705.     virtual LexStream::TokenIndex LeftToken()  { return left_expression -> LeftToken(); }
  3706.     virtual LexStream::TokenIndex RightToken() { return right_expression -> RightToken(); }
  3707. };
  3708.  
  3709.  
  3710. // 
  3711. // ConditionalExpression --> <CONDITIONAL, Expression, ?_token, Expression, :_token, Expression>
  3712. // 
  3713. class AstConditionalExpression : public AstExpression
  3714. {
  3715. public:
  3716.     AstExpression *test_expression;
  3717.     LexStream::TokenIndex question_token;
  3718.     AstExpression *true_expression;
  3719.     LexStream::TokenIndex colon_token;
  3720.     AstExpression *false_expression;
  3721.  
  3722.     AstConditionalExpression()
  3723.     {
  3724.         Ast::kind = Ast::CONDITIONAL;
  3725.         Ast::class_tag = Ast::EXPRESSION;
  3726.         Ast::generated = 0;
  3727.         AstExpression::value = NULL;
  3728.         AstExpression::symbol = NULL;
  3729.     }
  3730.  
  3731.     virtual ~AstConditionalExpression();
  3732.  
  3733. #ifdef TEST
  3734.     virtual void Print(LexStream &);
  3735. #endif
  3736.  
  3737.     virtual Ast *Clone(StoragePool *);
  3738.  
  3739.     virtual LexStream::TokenIndex LeftToken()  { return test_expression -> LeftToken(); }
  3740.     virtual LexStream::TokenIndex RightToken() { return false_expression -> RightToken(); }
  3741. };
  3742.  
  3743.  
  3744. // 
  3745. // Assignment --> <ASSIGNMENT, AssignmentTag, LeftHandSide, AssignmentOperator, Expression>
  3746. // 
  3747. // AssignmentTag --> EQUAL | STAR_EQUAL | SLASH_EQUAL | MOD_EQUAL | PLUS_EQUAL | MINUS_EQUAL |
  3748. //                   LEFT_SHIFT_EQUAL | RIGHT_SHIFT_EQUAL | UNSIGNED_RIGHT_SHIFT_EQUAL |
  3749. //                   AND_EQUAL | XOR_EQUAL | IOR_EQUAL
  3750. //
  3751. // LeftHandSide --> Name | FieldAccess | ArrayAccess
  3752. //                | <cAstkind, (_token_opt, Type_opt, Brackets )_token_opt, Name>
  3753. //                | <cAstkind, (_token_opt, Type_opt, Brackets )_token_opt, FieldAccess>
  3754. //                | <cAstkind, (_token_opt, Type_opt, Brackets )_token_opt, ArrayAccess>
  3755. //
  3756. // NOTE: that a LeftHandSide appears as a cast node only when the assignment_operator in question
  3757. // is of the form "op=" and the application of the operator requires a casting of the value of the
  3758. // left-hand side.
  3759. //
  3760. // AssignmentOperator --> =_token | *=_token | /=_token | %=_token | +=_token | -=_token |
  3761. //                        <<=_token | >>=_token | >>>=_token | &=_token | ^=_token | |=_token
  3762. //
  3763. class AstAssignmentExpression : public AstExpression
  3764. {
  3765. public:
  3766.     enum AssignmentExpressionTag
  3767.     {
  3768.         NONE,
  3769.         EQUAL,
  3770.         STAR_EQUAL,
  3771.         SLASH_EQUAL,
  3772.         MOD_EQUAL,
  3773.         PLUS_EQUAL,
  3774.         MINUS_EQUAL,
  3775.         LEFT_SHIFT_EQUAL,
  3776.         RIGHT_SHIFT_EQUAL,
  3777.         UNSIGNED_RIGHT_SHIFT_EQUAL,
  3778.  
  3779.  
  3780.         AND_EQUAL,
  3781.         XOR_EQUAL,
  3782.         IOR_EQUAL,
  3783.  
  3784.         _num_kinds
  3785.     };
  3786.  
  3787.     //
  3788.     // When the left-hand side of an assignment is a name that refers
  3789.     // to a private field in an enclosing scope, the access method
  3790.     // that gives write-permission to that field is recorded here.
  3791.     //
  3792.     MethodSymbol *write_method;
  3793.  
  3794.     AssignmentExpressionTag assignment_tag;
  3795.     AstExpression *left_hand_side;
  3796.     LexStream::TokenIndex assignment_operator_token;
  3797.     AstExpression *expression;
  3798.  
  3799.     AstAssignmentExpression(AssignmentExpressionTag tag_, LexStream::TokenIndex token_) : assignment_tag(tag_),
  3800.                                                                                           assignment_operator_token(token_),
  3801.                                                                                           write_method(NULL)
  3802.     {
  3803.         Ast::kind = Ast::ASSIGNMENT;
  3804.         Ast::class_tag = Ast::EXPRESSION;
  3805.         Ast::generated = 0;
  3806.         AstExpression::value = NULL;
  3807.         AstExpression::symbol = NULL;
  3808.     }
  3809.  
  3810.     virtual ~AstAssignmentExpression();
  3811.  
  3812. #ifdef TEST
  3813.     virtual void Print(LexStream &);
  3814. #endif
  3815.  
  3816.     virtual Ast *Clone(StoragePool *);
  3817.  
  3818.     virtual LexStream::TokenIndex LeftToken()  { return left_hand_side -> LeftToken(); }
  3819.     virtual LexStream::TokenIndex RightToken() { return expression -> RightToken(); }
  3820. };
  3821.  
  3822.  
  3823. //
  3824. // Given an Ast tree, check whether or not it is a Name - simple or qualified.
  3825. //
  3826. inline bool Ast::IsName()
  3827. {
  3828.     Ast *name = this;
  3829.     for (AstFieldAccess *field_access = name -> FieldAccessCast(); field_access && field_access -> IsNameAccess();
  3830.                                                                    field_access = name -> FieldAccessCast())
  3831.         name = field_access -> base;
  3832.     return (name -> SimpleNameCast() != NULL);
  3833. }
  3834.  
  3835.  
  3836. //
  3837. // Given an Ast tree, check whether or not it is a Name - simple or qualified.
  3838. //
  3839. inline bool Ast::IsLeftHandSide()
  3840. {
  3841.     return (this -> SimpleNameCast() || this -> FieldAccessCast() || this -> ArrayAccessCast());
  3842. }
  3843.  
  3844.  
  3845. //
  3846. // Given an Ast tree, check whether or not it is a Name - simple or qualified.
  3847. //
  3848. inline bool Ast::IsGenerated()
  3849. {
  3850.     return (generated == 1);
  3851. }
  3852.  
  3853.  
  3854. //
  3855. // This Storage pool is modeled after the Dynamic arrays. The difference is that
  3856. // instead of a Next() function we have an alloc(size_t) function. The value
  3857. // of the size_t argument represents the size of the object to allocate.
  3858. //
  3859. class StoragePool
  3860. {
  3861.     typedef void * Cell;
  3862.  
  3863.     Cell **base;
  3864.     int base_size,
  3865.         top,
  3866.         size;
  3867.  
  3868.     size_t log_blksize,
  3869.            base_increment;
  3870.  
  3871.     inline size_t Blksize() { return (1 << log_blksize); }
  3872.  
  3873.     //
  3874.     // Allocate another block of storage for the storage pool
  3875.     //
  3876.     inline void AllocateMoreSpace()
  3877.     {
  3878.         //
  3879.         // The variable size always indicates the maximum number of
  3880.         // cells that has been allocated for the storage pool.
  3881.         // Initially, it is set to 0 to indicate that the pool is empty.
  3882.         // The pool of available elements is divided into segments of size
  3883.         // 2**log_blksize each. Each segment is pointed to by a slot in
  3884.         // the array base.
  3885.         //
  3886.         // By dividing size by the size of the segment we obtain the
  3887.         // index for the next segment in base. If base is full, it is
  3888.         // reallocated.
  3889.         //
  3890.         //
  3891.         int k = size >> log_blksize; /* which segment? */
  3892.  
  3893.         //
  3894.         // If the base is overflowed, reallocate it and initialize the new elements to NULL.
  3895.         //
  3896.         if (k == base_size)
  3897.         {
  3898.             int old_base_size = base_size;
  3899.             Cell **old_base = base;
  3900.     
  3901.             base_size += base_increment;
  3902.             base = ::new Cell*[base_size];
  3903.     
  3904.             if (old_base != NULL)
  3905.             {
  3906.                 memmove(base, old_base, old_base_size * sizeof(Cell *));
  3907.                 delete [] old_base;
  3908.             }
  3909.             memset(&base[old_base_size], 0, (base_size - old_base_size) * sizeof(Cell *));
  3910.         }
  3911.     
  3912.         //
  3913.         // If the slot "k" does not already contain a segment,
  3914.         // we allocate a new segment and place its adjusted address in 
  3915.         // base[k]. The adjustment allows us to index the segment directly,
  3916.         // instead of having to perform a subtraction for each reference.
  3917.         // See operator[] below.
  3918.         //
  3919.         if (base[k] == NULL)
  3920.         {
  3921.             base[k] = ::new Cell[Blksize()];
  3922.             base[k] -= size;
  3923.         }
  3924.  
  3925.         //
  3926.         // Finally, we update SIZE.
  3927.         //
  3928.         size += Blksize();
  3929.  
  3930.         return;
  3931.     }
  3932.  
  3933. public:
  3934.  
  3935.     //
  3936.     // Constructor of a storage pool
  3937.     //
  3938.     StoragePool(size_t num_tokens)
  3939.     {
  3940.         //
  3941.         // Make a guess on the size that will be required for the ast
  3942.         // based on the number of tokens. The ratio for the bodies is
  3943.         // usually 40 to 1. We will double the base to add to account
  3944.         // for the headers
  3945.         //
  3946.         size_t estimate = num_tokens * 10; // recall that each cell is a-byte word. So, 10 * 4 = 40
  3947.  
  3948.         //
  3949.         // Find a block of size 2**log_blksize that is large enough 
  3950.         // to satisfy our estimate.
  3951.         //
  3952.         for (log_blksize = 8; (((unsigned) 1 << log_blksize) < estimate) && (log_blksize < 31); log_blksize++)
  3953.             ;
  3954.  
  3955.         //
  3956.         // If the size of the block found is < 1k, allocate a block of size 1k
  3957.         // with one slot to spare, just in case.
  3958.         // If the size is less than 16k, then break it up into equal blocks
  3959.         // of size 1k;
  3960.         // Otherwise, fragment it into pieces of size 16k.
  3961.         //
  3962.         if (log_blksize < 8)
  3963.         {
  3964.             base_increment = 1;
  3965.             log_blksize = 8;
  3966.         }
  3967.         else if (log_blksize < 13)
  3968.         {
  3969.             base_increment = (unsigned) 1 << (log_blksize - 8);
  3970.             log_blksize = 8;
  3971.         }
  3972.         else if (log_blksize < 17)
  3973.         {
  3974.             base_increment = (unsigned) 1 << (log_blksize - 10);
  3975.             log_blksize = 10;
  3976.         }
  3977.         else
  3978.         {
  3979.             base_increment = (unsigned) 1 << (log_blksize - 12); // assume we won't be allocating more than this many blocks.
  3980.             log_blksize = 12;
  3981.         }
  3982.  
  3983.         //
  3984.         // Double the size of the base in order to allocate extra space for the headers
  3985.         // and add a little margin for stuff like extra Cast node and computation of
  3986.         // static expressions that require cloning.
  3987.         //
  3988.         base_increment = (base_increment << 1) + 3;
  3989.  
  3990.         base_size = 0;
  3991.         size = 0;
  3992.         top = 0;
  3993.         base = NULL;
  3994.     }
  3995.  
  3996.     //
  3997.     // Destructor of a storage pool
  3998.     //
  3999.     ~StoragePool()
  4000.     {
  4001.         for (int k = (size >> log_blksize) - 1; k >= 0; k--)
  4002.         {
  4003.             size -= Blksize();
  4004.             base[k] += size;
  4005.             delete [] base[k];
  4006.         }
  4007.     
  4008.         delete [] base;
  4009.     }
  4010.  
  4011.     //
  4012.     // alloc allocates an object of size n in the pool and
  4013.     // returns a pointer to it.
  4014.     //
  4015.     inline void *Alloc(size_t n)
  4016.     {
  4017.         size_t i = top;
  4018.         top += ((n + sizeof(Cell) - 1) / sizeof(Cell));
  4019.         if (top > size)
  4020.         {
  4021.             if (n > Blksize()) // we cannot allocate a chunk of storage that is larger than the block !
  4022.                 assert(0);
  4023.             i = size;
  4024.             top = size + ((n + sizeof(Cell) - 1) / sizeof(Cell));
  4025.             AllocateMoreSpace();
  4026.         }
  4027.  
  4028.         return ((void *) &(base[i >> log_blksize] [i]));
  4029.     }
  4030.  
  4031.     //
  4032.     // Return length of the amount of storage that has been allocated so far.
  4033.     //
  4034.     inline size_t Length() { return top; }
  4035.  
  4036.     //
  4037.     // This function is used to reset the Storage pool. This action automatically
  4038.     // invalidates all objects that had been allocated in the pool. At least,
  4039.     // YOU should assume it does!!!
  4040.     //
  4041.     inline void Reset(const int n = 0)
  4042.     {
  4043.         if (n < 0 || n > size)
  4044.             assert(0);
  4045.         top = n;
  4046.     }
  4047.  
  4048.     //
  4049.     // This function frees up all dynamic space that
  4050.     // was allocated for this storage pool.
  4051.     //
  4052.     inline void Destroy()
  4053.     {
  4054.         for (int k = (size >> log_blksize) - 1; k >= 0; k--)
  4055.         {
  4056.             size -= Blksize();
  4057.             base[k] += size;
  4058.             delete [] base[k];
  4059.             base[k] = NULL;
  4060.         }
  4061.     
  4062.         delete [] base;
  4063.         base = NULL;
  4064.         base_size = 0;
  4065.     
  4066.         Reset();
  4067.  
  4068.         return;
  4069.     }
  4070.  
  4071.     // ********************************************************************************************** //
  4072.  
  4073.     inline AstArray<Ast *> *NewAstArray(unsigned size = 0)
  4074.     {
  4075.         return new (Alloc(sizeof(AstArray<Ast *>))) AstArray<Ast *>((StoragePool *) this, size);
  4076.     }
  4077.  
  4078.     inline AstListNode *NewListNode()
  4079.     {
  4080.         return new (Alloc(sizeof(AstListNode))) AstListNode();
  4081.     }
  4082.  
  4083.     inline AstBlock *NewBlock()
  4084.     {
  4085.         return new (Alloc(sizeof(AstBlock))) AstBlock((StoragePool *) this);
  4086.     }
  4087.  
  4088.     inline AstPrimitiveType *NewPrimitiveType(Ast::Kind kind, LexStream::TokenIndex token)
  4089.     {
  4090.         return new (Alloc(sizeof(AstPrimitiveType))) AstPrimitiveType(kind, token);
  4091.     }
  4092.  
  4093.     inline AstArrayType *NewArrayType()
  4094.     {
  4095.         return new (Alloc(sizeof(AstArrayType))) AstArrayType((StoragePool *) this);
  4096.     }
  4097.  
  4098.     inline AstSimpleName *NewSimpleName(LexStream::TokenIndex token)
  4099.     {
  4100.         return new (Alloc(sizeof(AstSimpleName))) AstSimpleName(token);
  4101.     }
  4102.  
  4103.     inline AstPackageDeclaration *NewPackageDeclaration()
  4104.     {
  4105.         return new (Alloc(sizeof(AstPackageDeclaration))) AstPackageDeclaration();
  4106.     }
  4107.  
  4108.     inline AstImportDeclaration *NewImportDeclaration()
  4109.     {
  4110.         return new (Alloc(sizeof(AstImportDeclaration))) AstImportDeclaration();
  4111.     }
  4112.  
  4113.     inline AstCompilationUnit *NewCompilationUnit()
  4114.     {
  4115.         return new (Alloc(sizeof(AstCompilationUnit))) AstCompilationUnit((StoragePool *) this);
  4116.     }
  4117.  
  4118.     inline AstModifier *NewModifier(Ast::Kind kind, LexStream::TokenIndex token)
  4119.     {
  4120.         return new (Alloc(sizeof(AstModifier))) AstModifier(kind, token);
  4121.     }
  4122.  
  4123.     inline AstEmptyDeclaration *NewEmptyDeclaration(LexStream::TokenIndex token)
  4124.     {
  4125.         return new (Alloc(sizeof(AstEmptyDeclaration))) AstEmptyDeclaration(token);
  4126.     }
  4127.  
  4128.     inline AstClassBody *NewClassBody()
  4129.     {
  4130.         return new (Alloc(sizeof(AstClassBody))) AstClassBody((StoragePool *) this);
  4131.     }
  4132.  
  4133.     inline AstClassDeclaration *NewClassDeclaration()
  4134.     {
  4135.         return new (Alloc(sizeof(AstClassDeclaration))) AstClassDeclaration((StoragePool *) this);
  4136.     }
  4137.  
  4138.     inline AstArrayInitializer *NewArrayInitializer()
  4139.     {
  4140.         return new (Alloc(sizeof(AstArrayInitializer))) AstArrayInitializer((StoragePool *) this);
  4141.     }
  4142.  
  4143.     inline AstBrackets *NewBrackets(LexStream::TokenIndex left, LexStream::TokenIndex right)
  4144.     {
  4145.         return new (Alloc(sizeof(AstBrackets))) AstBrackets(left, right);
  4146.     }
  4147.  
  4148.     inline AstVariableDeclaratorId *NewVariableDeclaratorId()
  4149.     {
  4150.         return new (Alloc(sizeof(AstVariableDeclaratorId))) AstVariableDeclaratorId((StoragePool *) this);
  4151.     }
  4152.  
  4153.     inline AstVariableDeclarator *NewVariableDeclarator()
  4154.     {
  4155.         return new (Alloc(sizeof(AstVariableDeclarator))) AstVariableDeclarator();
  4156.     }
  4157.  
  4158.     inline AstFieldDeclaration *NewFieldDeclaration()
  4159.     {
  4160.         return new (Alloc(sizeof(AstFieldDeclaration))) AstFieldDeclaration((StoragePool *) this);
  4161.     }
  4162.  
  4163.     inline AstFormalParameter *NewFormalParameter()
  4164.     {
  4165.         return new (Alloc(sizeof(AstFormalParameter))) AstFormalParameter((StoragePool *) this);
  4166.     }
  4167.  
  4168.     inline AstMethodDeclarator *NewMethodDeclarator()
  4169.     {
  4170.         return new (Alloc(sizeof(AstMethodDeclarator))) AstMethodDeclarator((StoragePool *) this);
  4171.     }
  4172.  
  4173.     inline AstMethodDeclaration *NewMethodDeclaration()
  4174.     {
  4175.         return new (Alloc(sizeof(AstMethodDeclaration))) AstMethodDeclaration((StoragePool *) this);
  4176.     }
  4177.  
  4178.     inline AstStaticInitializer *NewStaticInitializer()
  4179.     {
  4180.         return new (Alloc(sizeof(AstStaticInitializer))) AstStaticInitializer();
  4181.     }
  4182.  
  4183.     inline AstThisCall *NewThisCall()
  4184.     {
  4185.         return new (Alloc(sizeof(AstThisCall))) AstThisCall((StoragePool *) this);
  4186.     }
  4187.  
  4188.     inline AstSuperCall *NewSuperCall()
  4189.     {
  4190.         return new (Alloc(sizeof(AstSuperCall))) AstSuperCall((StoragePool *) this);
  4191.     }
  4192.  
  4193.     inline AstConstructorBlock *NewConstructorBlock()
  4194.     {
  4195.         return new (Alloc(sizeof(AstConstructorBlock))) AstConstructorBlock((StoragePool *) this);
  4196.     }
  4197.  
  4198.     inline AstConstructorDeclaration *NewConstructorDeclaration()
  4199.     {
  4200.         return new (Alloc(sizeof(AstConstructorDeclaration))) AstConstructorDeclaration((StoragePool *) this);
  4201.     }
  4202.  
  4203.     inline AstInterfaceDeclaration *NewInterfaceDeclaration()
  4204.     {
  4205.         return new (Alloc(sizeof(AstInterfaceDeclaration))) AstInterfaceDeclaration((StoragePool *) this);
  4206.     }
  4207.  
  4208.     inline AstLocalVariableDeclarationStatement *NewLocalVariableDeclarationStatement()
  4209.     {
  4210.         return new (Alloc(sizeof(AstLocalVariableDeclarationStatement))) AstLocalVariableDeclarationStatement((StoragePool *) this);
  4211.     }
  4212.  
  4213.     inline AstIfStatement *NewIfStatement()
  4214.     {
  4215.         return new (Alloc(sizeof(AstIfStatement))) AstIfStatement();
  4216.     }
  4217.  
  4218.     inline AstEmptyStatement *NewEmptyStatement(LexStream::TokenIndex token)
  4219.     {
  4220.         return new (Alloc(sizeof(AstEmptyStatement))) AstEmptyStatement(token);
  4221.     }
  4222.  
  4223.     inline AstExpressionStatement *NewExpressionStatement()
  4224.     {
  4225.         return new (Alloc(sizeof(AstExpressionStatement))) AstExpressionStatement();
  4226.     }
  4227.  
  4228.     inline AstCaseLabel *NewCaseLabel()
  4229.     {
  4230.         return new (Alloc(sizeof(AstCaseLabel))) AstCaseLabel();
  4231.     }
  4232.  
  4233.     inline AstDefaultLabel *NewDefaultLabel()
  4234.     {
  4235.         return new (Alloc(sizeof(AstDefaultLabel))) AstDefaultLabel();
  4236.     }
  4237.  
  4238.     inline AstSwitchBlockStatement *NewSwitchBlockStatement()
  4239.     {
  4240.         return new (Alloc(sizeof(AstSwitchBlockStatement))) AstSwitchBlockStatement((StoragePool *) this);
  4241.     }
  4242.  
  4243.     inline AstSwitchStatement *NewSwitchStatement()
  4244.     {
  4245.         return new (Alloc(sizeof(AstSwitchStatement))) AstSwitchStatement((StoragePool *) this);
  4246.     }
  4247.  
  4248.     inline AstWhileStatement *NewWhileStatement()
  4249.     {
  4250.         return new (Alloc(sizeof(AstWhileStatement))) AstWhileStatement();
  4251.     }
  4252.  
  4253.     inline AstDoStatement *NewDoStatement()
  4254.     {
  4255.         return new (Alloc(sizeof(AstDoStatement))) AstDoStatement();
  4256.     }
  4257.  
  4258.     inline AstForStatement *NewForStatement()
  4259.     {
  4260.         return new (Alloc(sizeof(AstForStatement))) AstForStatement((StoragePool *) this);
  4261.     }
  4262.  
  4263.     inline AstBreakStatement *NewBreakStatement()
  4264.     {
  4265.         return new (Alloc(sizeof(AstBreakStatement))) AstBreakStatement();
  4266.     }
  4267.  
  4268.     inline AstContinueStatement *NewContinueStatement()
  4269.     {
  4270.         return new (Alloc(sizeof(AstContinueStatement))) AstContinueStatement();
  4271.     }
  4272.  
  4273.     inline AstReturnStatement *NewReturnStatement()
  4274.     {
  4275.         return new (Alloc(sizeof(AstReturnStatement))) AstReturnStatement();
  4276.     }
  4277.  
  4278.     inline AstThrowStatement *NewThrowStatement()
  4279.     {
  4280.         return new (Alloc(sizeof(AstThrowStatement))) AstThrowStatement();
  4281.     }
  4282.  
  4283.     inline AstSynchronizedStatement *NewSynchronizedStatement()
  4284.     {
  4285.         return new (Alloc(sizeof(AstSynchronizedStatement))) AstSynchronizedStatement();
  4286.     }
  4287.  
  4288.     inline AstCatchClause *NewCatchClause()
  4289.     {
  4290.         return new (Alloc(sizeof(AstCatchClause))) AstCatchClause();
  4291.     }
  4292.  
  4293.     inline AstFinallyClause *NewFinallyClause()
  4294.     {
  4295.         return new (Alloc(sizeof(AstFinallyClause))) AstFinallyClause();
  4296.     }
  4297.  
  4298.     inline AstTryStatement *NewTryStatement()
  4299.     {
  4300.         return new (Alloc(sizeof(AstTryStatement))) AstTryStatement((StoragePool *) this);
  4301.     }
  4302.  
  4303.     inline AstIntegerLiteral *NewIntegerLiteral(LexStream::TokenIndex token)
  4304.     {
  4305.         return new (Alloc(sizeof(AstIntegerLiteral))) AstIntegerLiteral(token);
  4306.     }
  4307.  
  4308.     inline AstLongLiteral *NewLongLiteral(LexStream::TokenIndex token)
  4309.     {
  4310.         return new (Alloc(sizeof(AstLongLiteral))) AstLongLiteral(token);
  4311.     }
  4312.  
  4313.     inline AstFloatingPointLiteral *NewFloatingPointLiteral(LexStream::TokenIndex token)
  4314.     {
  4315.         return new (Alloc(sizeof(AstFloatingPointLiteral))) AstFloatingPointLiteral(token);
  4316.     }
  4317.  
  4318.     inline AstDoubleLiteral *NewDoubleLiteral(LexStream::TokenIndex token)
  4319.     {
  4320.         return new (Alloc(sizeof(AstDoubleLiteral))) AstDoubleLiteral(token);
  4321.     }
  4322.  
  4323.     inline AstTrueLiteral *NewTrueLiteral(LexStream::TokenIndex token)
  4324.     {
  4325.         return new (Alloc(sizeof(AstTrueLiteral))) AstTrueLiteral(token);
  4326.     }
  4327.  
  4328.     inline AstFalseLiteral *NewFalseLiteral(LexStream::TokenIndex token)
  4329.     {
  4330.         return new (Alloc(sizeof(AstFalseLiteral))) AstFalseLiteral(token);
  4331.     }
  4332.  
  4333.     inline AstStringLiteral *NewStringLiteral(LexStream::TokenIndex token)
  4334.     {
  4335.         return new (Alloc(sizeof(AstStringLiteral))) AstStringLiteral(token);
  4336.     }
  4337.  
  4338.     inline AstCharacterLiteral *NewCharacterLiteral(LexStream::TokenIndex token)
  4339.     {
  4340.         return new (Alloc(sizeof(AstCharacterLiteral))) AstCharacterLiteral(token);
  4341.     }
  4342.  
  4343.     inline AstNullLiteral *NewNullLiteral(LexStream::TokenIndex token)
  4344.     {
  4345.         return new (Alloc(sizeof(AstNullLiteral))) AstNullLiteral(token);
  4346.     }
  4347.  
  4348.     inline AstThisExpression *NewThisExpression(LexStream::TokenIndex token)
  4349.     {
  4350.         return new (Alloc(sizeof(AstThisExpression))) AstThisExpression(token);
  4351.     }
  4352.  
  4353.     inline AstSuperExpression *NewSuperExpression(LexStream::TokenIndex token)
  4354.     {
  4355.         return new (Alloc(sizeof(AstSuperExpression))) AstSuperExpression(token);
  4356.     }
  4357.  
  4358.     inline AstParenthesizedExpression *NewParenthesizedExpression()
  4359.     {
  4360.         return new (Alloc(sizeof(AstParenthesizedExpression))) AstParenthesizedExpression();
  4361.     }
  4362.  
  4363.     inline AstTypeExpression *NewTypeExpression(Ast *type)
  4364.     {
  4365.         return new (Alloc(sizeof(AstTypeExpression))) AstTypeExpression(type);
  4366.     }
  4367.  
  4368.     inline AstClassInstanceCreationExpression *NewClassInstanceCreationExpression()
  4369.     {
  4370.         return new (Alloc(sizeof(AstClassInstanceCreationExpression))) AstClassInstanceCreationExpression((StoragePool *) this);
  4371.     }
  4372.  
  4373.     inline AstDimExpr *NewDimExpr()
  4374.     {
  4375.         return new (Alloc(sizeof(AstDimExpr))) AstDimExpr();
  4376.     }
  4377.  
  4378.     inline AstArrayCreationExpression *NewArrayCreationExpression()
  4379.     {
  4380.         return new (Alloc(sizeof(AstArrayCreationExpression))) AstArrayCreationExpression((StoragePool *) this);
  4381.     }
  4382.  
  4383.     inline AstFieldAccess *NewFieldAccess(AstFieldAccess::FieldAccessTag tag = AstFieldAccess::NONE)
  4384.     {
  4385.         return new (Alloc(sizeof(AstFieldAccess))) AstFieldAccess(tag);
  4386.     }
  4387.  
  4388.     inline AstMethodInvocation *NewMethodInvocation()
  4389.     {
  4390.         return new (Alloc(sizeof(AstMethodInvocation))) AstMethodInvocation((StoragePool *) this);
  4391.     }
  4392.  
  4393.     inline AstArrayAccess *NewArrayAccess()
  4394.     {
  4395.         return new (Alloc(sizeof(AstArrayAccess))) AstArrayAccess();
  4396.     }
  4397.  
  4398.     inline AstPostUnaryExpression *NewPostUnaryExpression(AstPostUnaryExpression::PostUnaryExpressionTag tag)
  4399.     {
  4400.         return new (Alloc(sizeof(AstPostUnaryExpression))) AstPostUnaryExpression(tag);
  4401.     }
  4402.  
  4403.     inline AstPreUnaryExpression *NewPreUnaryExpression(AstPreUnaryExpression::PreUnaryExpressionTag tag)
  4404.     {
  4405.         return new (Alloc(sizeof(AstPreUnaryExpression))) AstPreUnaryExpression(tag);
  4406.     }
  4407.  
  4408.     inline AstCastExpression *NewCastExpression()
  4409.     {
  4410.         return new (Alloc(sizeof(AstCastExpression))) AstCastExpression((StoragePool *) this);
  4411.     }
  4412.  
  4413.     inline AstBinaryExpression *NewBinaryExpression(AstBinaryExpression::BinaryExpressionTag tag)
  4414.     {
  4415.         return new (Alloc(sizeof(AstBinaryExpression))) AstBinaryExpression(tag);
  4416.     }
  4417.  
  4418.     inline AstConditionalExpression *NewConditionalExpression()
  4419.     {
  4420.         return new (Alloc(sizeof(AstConditionalExpression))) AstConditionalExpression();
  4421.     }
  4422.  
  4423.     inline AstAssignmentExpression *NewAssignmentExpression(AstAssignmentExpression::AssignmentExpressionTag tag, LexStream::TokenIndex token)
  4424.     {
  4425.         return new (Alloc(sizeof(AstAssignmentExpression))) AstAssignmentExpression(tag, token);
  4426.     }
  4427.  
  4428.     // ********************************************************************************************** //
  4429.  
  4430.     //
  4431.     // Note that CaseElement nodes are always generated.
  4432.     // Since they are not Ast nodes they do not need to
  4433.     // be marked.
  4434.     //
  4435.     inline CaseElement *GenCaseElement()
  4436.     {
  4437.         return new (Alloc(sizeof(CaseElement))) CaseElement();
  4438.     }
  4439.  
  4440.     inline AstBlock *GenBlock()
  4441.     {
  4442.         AstBlock *p = NewBlock();
  4443.         p -> generated = 1;
  4444.         return p;
  4445.     }
  4446.  
  4447.     inline AstPrimitiveType *GenPrimitiveType(Ast::Kind kind, LexStream::TokenIndex token)
  4448.     {
  4449.         AstPrimitiveType *p = NewPrimitiveType(kind, token);
  4450.         p -> generated = 1;
  4451.         return p;
  4452.     }
  4453.  
  4454.     inline AstArrayType *GenArrayType()
  4455.     {
  4456.         AstArrayType *p = NewArrayType();
  4457.         p -> generated = 1;
  4458.         return p;
  4459.     }
  4460.  
  4461.     inline AstSimpleName *GenSimpleName(LexStream::TokenIndex token)
  4462.     {
  4463.         AstSimpleName *p = NewSimpleName(token);
  4464.         p -> generated = 1;
  4465.         return p;
  4466.     }
  4467.  
  4468.     inline AstPackageDeclaration *GenPackageDeclaration()
  4469.     {
  4470.         AstPackageDeclaration *p = NewPackageDeclaration();
  4471.         p -> generated = 1;
  4472.         return p;
  4473.     }
  4474.  
  4475.     inline AstImportDeclaration *GenImportDeclaration()
  4476.     {
  4477.         AstImportDeclaration *p = NewImportDeclaration();
  4478.         p -> generated = 1;
  4479.         return p;
  4480.     }
  4481.  
  4482.     inline AstCompilationUnit *GenCompilationUnit()
  4483.     {
  4484.         AstCompilationUnit *p = NewCompilationUnit();
  4485.         p -> generated = 1;
  4486.         return p;
  4487.     }
  4488.  
  4489.     inline AstModifier *GenModifier(Ast::Kind kind, LexStream::TokenIndex token)
  4490.     {
  4491.         AstModifier *p = NewModifier(kind, token);
  4492.         p -> generated = 1;
  4493.         return p;
  4494.     }
  4495.  
  4496.     inline AstEmptyDeclaration *GenEmptyDeclaration(LexStream::TokenIndex token)
  4497.     {
  4498.         AstEmptyDeclaration *p = NewEmptyDeclaration(token);
  4499.         p -> generated = 1;
  4500.         return p;
  4501.     }
  4502.  
  4503.     inline AstClassBody *GenClassBody()
  4504.     {
  4505.         AstClassBody *p = NewClassBody();
  4506.         p -> generated = 1;
  4507.         return p;
  4508.     }
  4509.  
  4510.     inline AstClassDeclaration *GenClassDeclaration()
  4511.     {
  4512.         AstClassDeclaration *p = NewClassDeclaration();
  4513.         p -> generated = 1;
  4514.         return p;
  4515.     }
  4516.  
  4517.     inline AstArrayInitializer *GenArrayInitializer()
  4518.     {
  4519.         AstArrayInitializer *p = NewArrayInitializer();
  4520.         p -> generated = 1;
  4521.         return p;
  4522.     }
  4523.  
  4524.     inline AstBrackets *GenBrackets(LexStream::TokenIndex left, LexStream::TokenIndex right)
  4525.     {
  4526.         AstBrackets *p = NewBrackets(left, right);
  4527.         p -> generated = 1;
  4528.         return p;
  4529.     }
  4530.  
  4531.     inline AstVariableDeclaratorId *GenVariableDeclaratorId()
  4532.     {
  4533.         AstVariableDeclaratorId *p = NewVariableDeclaratorId();
  4534.         p -> generated = 1;
  4535.         return p;
  4536.     }
  4537.  
  4538.     inline AstVariableDeclarator *GenVariableDeclarator()
  4539.     {
  4540.         AstVariableDeclarator *p = NewVariableDeclarator();
  4541.         p -> generated = 1;
  4542.         return p;
  4543.     }
  4544.  
  4545.     inline AstFieldDeclaration *GenFieldDeclaration()
  4546.     {
  4547.         AstFieldDeclaration *p = NewFieldDeclaration();
  4548.         p -> generated = 1;
  4549.         return p;
  4550.     }
  4551.  
  4552.     inline AstFormalParameter *GenFormalParameter()
  4553.     {
  4554.         AstFormalParameter *p = NewFormalParameter();
  4555.         p -> generated = 1;
  4556.         return p;
  4557.     }
  4558.  
  4559.     inline AstMethodDeclarator *GenMethodDeclarator()
  4560.     {
  4561.         AstMethodDeclarator *p = NewMethodDeclarator();
  4562.         p -> generated = 1;
  4563.         return p;
  4564.     }
  4565.  
  4566.     inline AstMethodDeclaration *GenMethodDeclaration()
  4567.     {
  4568.         AstMethodDeclaration *p = NewMethodDeclaration();
  4569.         p -> generated = 1;
  4570.         return p;
  4571.     }
  4572.  
  4573.     inline AstStaticInitializer *GenStaticInitializer()
  4574.     {
  4575.         AstStaticInitializer *p = NewStaticInitializer();
  4576.         p -> generated = 1;
  4577.         return p;
  4578.     }
  4579.  
  4580.     inline AstThisCall *GenThisCall()
  4581.     {
  4582.         AstThisCall *p = NewThisCall();
  4583.         p -> generated = 1;
  4584.         return p;
  4585.     }
  4586.  
  4587.     inline AstSuperCall *GenSuperCall()
  4588.     {
  4589.         AstSuperCall *p = NewSuperCall();
  4590.         p -> generated = 1;
  4591.         return p;
  4592.     }
  4593.  
  4594.     inline AstConstructorBlock *GenConstructorBlock()
  4595.     {
  4596.         AstConstructorBlock *p = NewConstructorBlock();
  4597.         p -> generated = 1;
  4598.         return p;
  4599.     }
  4600.  
  4601.     inline AstConstructorDeclaration *GenConstructorDeclaration()
  4602.     {
  4603.         AstConstructorDeclaration *p = NewConstructorDeclaration();
  4604.         p -> generated = 1;
  4605.         return p;
  4606.     }
  4607.  
  4608.     inline AstInterfaceDeclaration *GenInterfaceDeclaration()
  4609.     {
  4610.         AstInterfaceDeclaration *p = NewInterfaceDeclaration();
  4611.         p -> generated = 1;
  4612.         return p;
  4613.     }
  4614.  
  4615.     inline AstLocalVariableDeclarationStatement *GenLocalVariableDeclarationStatement()
  4616.     {
  4617.         AstLocalVariableDeclarationStatement *p = NewLocalVariableDeclarationStatement();
  4618.         p -> generated = 1;
  4619.         return p;
  4620.     }
  4621.  
  4622.     inline AstIfStatement *GenIfStatement()
  4623.     {
  4624.         AstIfStatement *p = NewIfStatement();
  4625.         p -> generated = 1;
  4626.         return p;
  4627.     }
  4628.  
  4629.     inline AstEmptyStatement *GenEmptyStatement(LexStream::TokenIndex token)
  4630.     {
  4631.         AstEmptyStatement *p = NewEmptyStatement(token);
  4632.         p -> generated = 1;
  4633.         return p;
  4634.     }
  4635.  
  4636.     inline AstExpressionStatement *GenExpressionStatement()
  4637.     {
  4638.         AstExpressionStatement *p = NewExpressionStatement();
  4639.         p -> generated = 1;
  4640.         return p;
  4641.     }
  4642.  
  4643.     inline AstCaseLabel *GenCaseLabel()
  4644.     {
  4645.         AstCaseLabel *p = NewCaseLabel();
  4646.         p -> generated = 1;
  4647.         return p;
  4648.     }
  4649.  
  4650.     inline AstDefaultLabel *GenDefaultLabel()
  4651.     {
  4652.         AstDefaultLabel *p = NewDefaultLabel();
  4653.         p -> generated = 1;
  4654.         return p;
  4655.     }
  4656.  
  4657.     inline AstSwitchBlockStatement *GenSwitchBlockStatement()
  4658.     {
  4659.         AstSwitchBlockStatement *p = NewSwitchBlockStatement();
  4660.         p -> generated = 1;
  4661.         return p;
  4662.     }
  4663.  
  4664.     inline AstSwitchStatement *GenSwitchStatement()
  4665.     {
  4666.         AstSwitchStatement *p = NewSwitchStatement();
  4667.         p -> generated = 1;
  4668.         return p;
  4669.     }
  4670.  
  4671.     inline AstWhileStatement *GenWhileStatement()
  4672.     {
  4673.         AstWhileStatement *p = NewWhileStatement();
  4674.         p -> generated = 1;
  4675.         return p;
  4676.     }
  4677.  
  4678.     inline AstDoStatement *GenDoStatement()
  4679.     {
  4680.         AstDoStatement *p = NewDoStatement();
  4681.         p -> generated = 1;
  4682.         return p;
  4683.     }
  4684.  
  4685.     inline AstForStatement *GenForStatement()
  4686.     {
  4687.         AstForStatement *p = NewForStatement();
  4688.         p -> generated = 1;
  4689.         return p;
  4690.     }
  4691.  
  4692.     inline AstBreakStatement *GenBreakStatement()
  4693.     {
  4694.         AstBreakStatement *p = NewBreakStatement();
  4695.         p -> generated = 1;
  4696.         return p;
  4697.     }
  4698.  
  4699.     inline AstContinueStatement *GenContinueStatement()
  4700.     {
  4701.         AstContinueStatement *p = NewContinueStatement();
  4702.         p -> generated = 1;
  4703.         return p;
  4704.     }
  4705.  
  4706.     inline AstReturnStatement *GenReturnStatement()
  4707.     {
  4708.         AstReturnStatement *p = NewReturnStatement();
  4709.         p -> generated = 1;
  4710.         return p;
  4711.     }
  4712.  
  4713.     inline AstThrowStatement *GenThrowStatement()
  4714.     {
  4715.         AstThrowStatement *p = NewThrowStatement();
  4716.         p -> generated = 1;
  4717.         return p;
  4718.     }
  4719.  
  4720.     inline AstSynchronizedStatement *GenSynchronizedStatement()
  4721.     {
  4722.         AstSynchronizedStatement *p = NewSynchronizedStatement();
  4723.         p -> generated = 1;
  4724.         return p;
  4725.     }
  4726.  
  4727.     inline AstCatchClause *GenCatchClause()
  4728.     {
  4729.         AstCatchClause *p = NewCatchClause();
  4730.         p -> generated = 1;
  4731.         return p;
  4732.     }
  4733.  
  4734.     inline AstFinallyClause *GenFinallyClause()
  4735.     {
  4736.         AstFinallyClause *p = NewFinallyClause();
  4737.         p -> generated = 1;
  4738.         return p;
  4739.     }
  4740.  
  4741.     inline AstTryStatement *GenTryStatement()
  4742.     {
  4743.         AstTryStatement *p = NewTryStatement();
  4744.         p -> generated = 1;
  4745.         return p;
  4746.     }
  4747.  
  4748.     inline AstIntegerLiteral *GenIntegerLiteral(LexStream::TokenIndex token)
  4749.     {
  4750.         AstIntegerLiteral *p = NewIntegerLiteral(token);
  4751.         p -> generated = 1;
  4752.         return p;
  4753.     }
  4754.  
  4755.     inline AstLongLiteral *GenLongLiteral(LexStream::TokenIndex token)
  4756.     {
  4757.         AstLongLiteral *p = NewLongLiteral(token);
  4758.         p -> generated = 1;
  4759.         return p;
  4760.     }
  4761.  
  4762.     inline AstFloatingPointLiteral *GenFloatingPointLiteral(LexStream::TokenIndex token)
  4763.     {
  4764.         AstFloatingPointLiteral *p = NewFloatingPointLiteral(token);
  4765.         p -> generated = 1;
  4766.         return p;
  4767.     }
  4768.  
  4769.     inline AstDoubleLiteral *GenDoubleLiteral(LexStream::TokenIndex token)
  4770.     {
  4771.         AstDoubleLiteral *p = NewDoubleLiteral(token);
  4772.         p -> generated = 1;
  4773.         return p;
  4774.     }
  4775.  
  4776.     inline AstTrueLiteral *GenTrueLiteral(LexStream::TokenIndex token)
  4777.     {
  4778.         AstTrueLiteral *p = NewTrueLiteral(token);
  4779.         p -> generated = 1;
  4780.         return p;
  4781.     }
  4782.  
  4783.     inline AstFalseLiteral *GenFalseLiteral(LexStream::TokenIndex token)
  4784.     {
  4785.         AstFalseLiteral *p = NewFalseLiteral(token);
  4786.         p -> generated = 1;
  4787.         return p;
  4788.     }
  4789.  
  4790.     inline AstStringLiteral *GenStringLiteral(LexStream::TokenIndex token)
  4791.     {
  4792.         AstStringLiteral *p = NewStringLiteral(token);
  4793.         p -> generated = 1;
  4794.         return p;
  4795.     }
  4796.  
  4797.     inline AstCharacterLiteral *GenCharacterLiteral(LexStream::TokenIndex token)
  4798.     {
  4799.         AstCharacterLiteral *p = NewCharacterLiteral(token);
  4800.         p -> generated = 1;
  4801.         return p;
  4802.     }
  4803.  
  4804.     inline AstNullLiteral *GenNullLiteral(LexStream::TokenIndex token)
  4805.     {
  4806.         AstNullLiteral *p = NewNullLiteral(token);
  4807.         p -> generated = 1;
  4808.         return p;
  4809.     }
  4810.  
  4811.     inline AstThisExpression *GenThisExpression(LexStream::TokenIndex token)
  4812.     {
  4813.         AstThisExpression *p = NewThisExpression(token);
  4814.         p -> generated = 1;
  4815.         return p;
  4816.     }
  4817.  
  4818.     inline AstSuperExpression *GenSuperExpression(LexStream::TokenIndex token)
  4819.     {
  4820.         AstSuperExpression *p = NewSuperExpression(token);
  4821.         p -> generated = 1;
  4822.         return p;
  4823.     }
  4824.  
  4825.     inline AstParenthesizedExpression *GenParenthesizedExpression()
  4826.     {
  4827.         AstParenthesizedExpression *p = NewParenthesizedExpression();
  4828.         p -> generated = 1;
  4829.         return p;
  4830.     }
  4831.  
  4832.     inline AstTypeExpression *GenTypeExpression(Ast *type)
  4833.     {
  4834.         AstTypeExpression *p = NewTypeExpression(type);
  4835.         p -> generated = 1;
  4836.         return p;
  4837.     }
  4838.  
  4839.     inline AstClassInstanceCreationExpression *GenClassInstanceCreationExpression()
  4840.     {
  4841.         AstClassInstanceCreationExpression *p = NewClassInstanceCreationExpression();
  4842.         p -> generated = 1;
  4843.         return p;
  4844.     }
  4845.  
  4846.     inline AstDimExpr *GenDimExpr()
  4847.     {
  4848.         AstDimExpr *p = NewDimExpr();
  4849.         p -> generated = 1;
  4850.         return p;
  4851.     }
  4852.  
  4853.     inline AstArrayCreationExpression *GenArrayCreationExpression()
  4854.     {
  4855.         AstArrayCreationExpression *p = NewArrayCreationExpression();
  4856.         p -> generated = 1;
  4857.         return p;
  4858.     }
  4859.  
  4860.     inline AstFieldAccess *GenFieldAccess(AstFieldAccess::FieldAccessTag tag = AstFieldAccess::NONE)
  4861.     {
  4862.         AstFieldAccess *p = NewFieldAccess(tag);
  4863.         p -> generated = 1;
  4864.         return p;
  4865.     }
  4866.  
  4867.     inline AstMethodInvocation *GenMethodInvocation()
  4868.     {
  4869.         AstMethodInvocation *p = NewMethodInvocation();
  4870.         p -> generated = 1;
  4871.         return p;
  4872.     }
  4873.  
  4874.     inline AstArrayAccess *GenArrayAccess()
  4875.     {
  4876.         AstArrayAccess *p = NewArrayAccess();
  4877.         p -> generated = 1;
  4878.         return p;
  4879.     }
  4880.  
  4881.     inline AstPostUnaryExpression *GenPostUnaryExpression(AstPostUnaryExpression::PostUnaryExpressionTag tag)
  4882.     {
  4883.         AstPostUnaryExpression *p = NewPostUnaryExpression(tag);
  4884.         p -> generated = 1;
  4885.         return p;
  4886.     }
  4887.  
  4888.     inline AstPreUnaryExpression *GenPreUnaryExpression(AstPreUnaryExpression::PreUnaryExpressionTag tag)
  4889.     {
  4890.         AstPreUnaryExpression *p = NewPreUnaryExpression(tag);
  4891.         p -> generated = 1;
  4892.         return p;
  4893.     }
  4894.  
  4895.     inline AstCastExpression *GenCastExpression()
  4896.     {
  4897.         AstCastExpression *p = NewCastExpression();
  4898.         p -> generated = 1;
  4899.         return p;
  4900.     }
  4901.  
  4902.     inline AstBinaryExpression *GenBinaryExpression(AstBinaryExpression::BinaryExpressionTag tag)
  4903.     {
  4904.         AstBinaryExpression *p = NewBinaryExpression(tag);
  4905.         p -> generated = 1;
  4906.         return p;
  4907.     }
  4908.  
  4909.     inline AstConditionalExpression *GenConditionalExpression()
  4910.     {
  4911.         AstConditionalExpression *p = NewConditionalExpression();
  4912.         p -> generated = 1;
  4913.         return p;
  4914.     }
  4915.  
  4916.     inline AstAssignmentExpression *GenAssignmentExpression(AstAssignmentExpression::AssignmentExpressionTag tag, LexStream::TokenIndex token)
  4917.     {
  4918.         AstAssignmentExpression *p = NewAssignmentExpression(tag, token);
  4919.         p -> generated = 1;
  4920.         return p;
  4921.     }
  4922.  
  4923.  
  4924.     // ********************************************************************************************** //
  4925.  
  4926.     //
  4927.     // Return the total size of temporary space allocated.
  4928.     //
  4929.     size_t SpaceAllocated(void)
  4930.     {
  4931.         return ((base_size * sizeof(Cell **)) + (size * sizeof(Cell)));
  4932.     }
  4933.  
  4934.     //
  4935.     // Return the total size of temporary space used.
  4936.     //
  4937.     size_t SpaceUsed(void)
  4938.     {
  4939.         return (((size >> log_blksize) * sizeof(Cell **)) + (top * sizeof(Cell)));
  4940.     }
  4941. };
  4942.  
  4943. //
  4944. // Allocate another block of storage for the ast array.
  4945. //
  4946. template <class T>
  4947.     void AstArray<T>::AllocateMoreSpace()
  4948.     {
  4949.         //
  4950.         //
  4951.         // The variable size always indicates the maximum number of
  4952.         // elements that has been allocated for the array.
  4953.         // Initially, it is set to 0 to indicate that the array is empty.
  4954.         // The pool of available elements is divided into segments of size
  4955.         // 2**log_blksize each. Each segment is pointed to by a slot in
  4956.         // the array base.
  4957.         //
  4958.         // By dividing size by the size of the segment we obtain the
  4959.         // index for the next segment in base. If base is full, it is
  4960.         // reallocated.
  4961.         //
  4962.         //
  4963.         int k = size >> log_blksize; /* which segment? */
  4964.     
  4965.         //
  4966.         // If the base is overflowed, reallocate it and initialize the new elements to NULL.
  4967.         //
  4968.         if (k == base_size)
  4969.         {
  4970.             int old_base_size = base_size;
  4971.             T **old_base = base;
  4972.     
  4973.             base_size += base_increment;
  4974.             base = (T **) pool -> Alloc(sizeof(T *) * base_size);
  4975.     
  4976.             if (old_base != NULL)
  4977.             {
  4978.                 memmove(base, old_base, old_base_size * sizeof(T *));
  4979. // STG:
  4980. //                delete [] old_base;
  4981.             }
  4982.             memset(&base[old_base_size], 0, (base_size - old_base_size) * sizeof(T *));
  4983.         }
  4984.     
  4985.         //
  4986.         // We allocate a new segment and place its adjusted address in 
  4987.         // base[k]. The adjustment allows us to index the segment directly,
  4988.         // instead of having to perform a subtraction for each reference.
  4989.         // See operator[] below.
  4990.         //
  4991.         base[k] = (T *) pool -> Alloc(sizeof(T) * Blksize());
  4992.         base[k] -= size;
  4993.     
  4994.         //
  4995.         // Finally, we update size.
  4996.         //
  4997.         size += Blksize();
  4998.     
  4999.         return;
  5000.     }
  5001.  
  5002. inline void AstClassBody::AllocateInstanceVariables(int estimate)
  5003. {
  5004.     if (! instance_variables)
  5005.         instance_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray(estimate);
  5006. }
  5007.  
  5008. inline void AstClassBody::AddInstanceVariable(AstFieldDeclaration *field_declaration)
  5009. {
  5010.     if (! instance_variables)
  5011.         instance_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray();
  5012.     instance_variables -> Next() = field_declaration;
  5013. }
  5014.  
  5015. inline void AstClassBody::AllocateClassVariables(int estimate)
  5016. {
  5017.     if (! class_variables)
  5018.         class_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray(estimate);
  5019. }
  5020.  
  5021. inline void AstClassBody::AddClassVariable(AstFieldDeclaration *field_declaration)
  5022. {
  5023.     if (! class_variables)
  5024.         class_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray();
  5025.     class_variables -> Next() = field_declaration;
  5026. }
  5027.  
  5028. inline void AstClassBody::AllocateMethods(int estimate)
  5029. {
  5030.     if (! methods)
  5031.         methods = (AstArray<AstMethodDeclaration *> *) pool -> NewAstArray(estimate);
  5032. }
  5033.  
  5034. inline void AstClassBody::AddMethod(AstMethodDeclaration *method_declaration)
  5035. {
  5036.     if (! methods)
  5037.         methods = (AstArray<AstMethodDeclaration *> *) pool -> NewAstArray();
  5038.     methods -> Next() = method_declaration;
  5039. }
  5040.  
  5041. inline void AstClassBody::AllocateBlocks(int estimate)
  5042. {
  5043.     if (! blocks)
  5044.         blocks = (AstArray<AstBlock *> *) pool -> NewAstArray(estimate);
  5045. }
  5046.  
  5047. inline void AstClassBody::AddBlock(AstBlock *block)
  5048. {
  5049.     if (! blocks)
  5050.         blocks = (AstArray<AstBlock *> *) pool -> NewAstArray();
  5051.     blocks -> Next() = block;
  5052. }
  5053.  
  5054. inline void AstClassBody::AllocateNestedInterfaces(int estimate)
  5055. {
  5056.     if (! inner_interfaces)
  5057.         inner_interfaces = (AstArray<AstInterfaceDeclaration *> *) pool -> NewAstArray(estimate);
  5058. }
  5059.  
  5060. inline void AstClassBody::AddNestedInterface(AstInterfaceDeclaration *interface_declaration)
  5061. {
  5062.     if (! inner_interfaces)
  5063.         inner_interfaces = (AstArray<AstInterfaceDeclaration *> *) pool -> NewAstArray();
  5064.     inner_interfaces -> Next() = interface_declaration;
  5065. }
  5066.  
  5067. inline void AstClassBody::AllocateNestedClasses(int estimate)
  5068. {
  5069.     if (! inner_classes)
  5070.         inner_classes = (AstArray<AstClassDeclaration *> *) pool -> NewAstArray(estimate);
  5071. }
  5072.  
  5073. inline void AstClassBody::AddNestedClass(AstClassDeclaration *class_declaration)
  5074. {
  5075.     if (! inner_classes)
  5076.         inner_classes = (AstArray<AstClassDeclaration *> *) pool -> NewAstArray();
  5077.     inner_classes -> Next() = class_declaration;
  5078. }
  5079.  
  5080. inline void AstClassBody::AllocateStaticInitializers(int estimate)
  5081. {
  5082.     if (! static_initializers)
  5083.         static_initializers = (AstArray<AstStaticInitializer *> *) pool -> NewAstArray(estimate);
  5084. }
  5085.  
  5086. inline void AstClassBody::AddStaticInitializer(AstStaticInitializer *static_initializer)
  5087. {
  5088.     if (! static_initializers)
  5089.         static_initializers = (AstArray<AstStaticInitializer *> *) pool -> NewAstArray();
  5090.     static_initializers -> Next() = static_initializer;
  5091. }
  5092.  
  5093. inline void AstClassBody::AllocateConstructors(int estimate)
  5094. {
  5095.     if (! constructors)
  5096.         constructors = (AstArray<AstConstructorDeclaration *> *) pool -> NewAstArray(estimate);
  5097. }
  5098.  
  5099. inline void AstClassBody::AddConstructor(AstConstructorDeclaration *constructor_declaration)
  5100. {
  5101.     if (! constructors)
  5102.         constructors = (AstArray<AstConstructorDeclaration *> *) pool -> NewAstArray();
  5103.     constructors -> Next() = constructor_declaration;
  5104. }
  5105.  
  5106. inline void AstClassBody::AllocateEmptyDeclarations(int estimate)
  5107. {
  5108.     if (! empty_declarations)
  5109.         empty_declarations = (AstArray<AstEmptyDeclaration *> *) pool -> NewAstArray(estimate);
  5110. }
  5111.  
  5112. inline void AstClassBody::AddEmptyDeclaration(AstEmptyDeclaration *empty_declaration)
  5113. {
  5114.     if (! empty_declarations)
  5115.         empty_declarations = (AstArray<AstEmptyDeclaration *> *) pool -> NewAstArray();
  5116.     empty_declarations -> Next() = empty_declaration;
  5117. }
  5118.  
  5119. inline void AstInterfaceDeclaration::AllocateNestedInterfaces(int estimate)
  5120. {
  5121.     if (! inner_interfaces)
  5122.         inner_interfaces = (AstArray<AstInterfaceDeclaration *> *) pool -> NewAstArray(estimate);
  5123. }
  5124.  
  5125. inline void AstInterfaceDeclaration::AddNestedInterface(AstInterfaceDeclaration *interface_declaration)
  5126. {
  5127.     if (! inner_interfaces)
  5128.         inner_interfaces = (AstArray<AstInterfaceDeclaration *> *) pool -> NewAstArray();
  5129.     inner_interfaces -> Next() = interface_declaration;
  5130. }
  5131.  
  5132. inline void AstInterfaceDeclaration::AllocateNestedClasses(int estimate)
  5133. {
  5134.     if (! inner_classes)
  5135.         inner_classes = (AstArray<AstClassDeclaration *> *) pool -> NewAstArray(estimate);
  5136. }
  5137.  
  5138. inline void AstInterfaceDeclaration::AddNestedClass(AstClassDeclaration *class_declaration)
  5139. {
  5140.     if (! inner_classes)
  5141.         inner_classes = (AstArray<AstClassDeclaration *> *) pool -> NewAstArray();
  5142.     inner_classes -> Next() = class_declaration;
  5143. }
  5144.  
  5145. inline void AstInterfaceDeclaration::AllocateMethods(int estimate)
  5146. {
  5147.     if (! methods)
  5148.         methods = (AstArray<AstMethodDeclaration *> *) pool -> NewAstArray(estimate);
  5149. }
  5150.  
  5151. inline void AstInterfaceDeclaration::AddMethod(AstMethodDeclaration *method_declaration)
  5152. {
  5153.     if (! methods)
  5154.         methods = (AstArray<AstMethodDeclaration *> *) pool -> NewAstArray();
  5155.     methods -> Next() = method_declaration;
  5156. }
  5157.  
  5158. inline void AstInterfaceDeclaration::AllocateClassVariables(int estimate)
  5159. {
  5160.     if (! class_variables)
  5161.         class_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray(estimate);
  5162. }
  5163.  
  5164. inline void AstInterfaceDeclaration::AddClassVariable(AstFieldDeclaration *field_declaration)
  5165. {
  5166.     if (! class_variables)
  5167.         class_variables = (AstArray<AstFieldDeclaration *> *) pool -> NewAstArray();
  5168.     class_variables -> Next() = field_declaration;
  5169. }
  5170.  
  5171. inline void AstInterfaceDeclaration::AllocateEmptyDeclarations(int estimate)
  5172. {
  5173.     if (! empty_declarations)
  5174.         empty_declarations = (AstArray<AstEmptyDeclaration *> *) pool -> NewAstArray(estimate);
  5175. }
  5176.  
  5177. inline void AstInterfaceDeclaration::AddEmptyDeclaration(AstEmptyDeclaration *empty_declaration)
  5178. {
  5179.     if (! empty_declarations)
  5180.         empty_declarations = (AstArray<AstEmptyDeclaration *> *) pool -> NewAstArray();
  5181.     empty_declarations -> Next() = empty_declaration;
  5182. }
  5183.  
  5184. inline void AstClassDeclaration::AllocateClassModifiers(int estimate)
  5185. {
  5186.     if (! class_modifiers)
  5187.         class_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5188. }
  5189.  
  5190. inline void AstClassDeclaration::AddClassModifier(AstModifier *class_modifier)
  5191. {
  5192.     if (! class_modifiers)
  5193.         AllocateClassModifiers(4); // there are only 10 modifiers.
  5194.     class_modifiers -> Next() = class_modifier;
  5195. }
  5196.  
  5197. inline void AstFieldDeclaration::AllocateVariableModifiers(int estimate)
  5198. {
  5199.     if (! variable_modifiers)
  5200.         variable_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5201. }
  5202.  
  5203. inline void AstFieldDeclaration::AddVariableModifier(AstModifier *variable_modifier)
  5204. {
  5205.     if (! variable_modifiers)
  5206.         AllocateVariableModifiers(4); // there are only 10 modifiers.
  5207.     variable_modifiers -> Next() = variable_modifier;
  5208. }
  5209.  
  5210. inline void AstFormalParameter::AllocateParameterModifiers(int estimate)
  5211. {
  5212.     if (! parameter_modifiers)
  5213.         parameter_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5214. }
  5215.  
  5216. inline void AstFormalParameter::AddParameterModifier(AstModifier *parameter_modifier)
  5217. {
  5218.     if (! parameter_modifiers)
  5219.         AllocateParameterModifiers(4); // there are only 10 modifiers.
  5220.     parameter_modifiers -> Next() = parameter_modifier;
  5221. }
  5222.  
  5223. inline void AstMethodDeclaration::AllocateMethodModifiers(int estimate)
  5224. {
  5225.     if (! method_modifiers)
  5226.         method_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5227. }
  5228.  
  5229. inline void AstMethodDeclaration::AddMethodModifier(AstModifier *method_modifier)
  5230. {
  5231.     if (! method_modifiers)
  5232.         AllocateMethodModifiers(4); // there are only 10 modifiers.
  5233.     method_modifiers -> Next() = method_modifier;
  5234. }
  5235.  
  5236. inline void AstConstructorDeclaration::AllocateConstructorModifiers(int estimate)
  5237. {
  5238.     if (! constructor_modifiers)
  5239.         constructor_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5240. }
  5241.  
  5242. inline void AstConstructorDeclaration::AddConstructorModifier(AstModifier *constructor_modifier)
  5243. {
  5244.     if (! constructor_modifiers)
  5245.         AllocateConstructorModifiers(4); // there are only 10 modifiers.
  5246.     constructor_modifiers -> Next() = constructor_modifier;
  5247. }
  5248.  
  5249. inline void AstInterfaceDeclaration::AllocateInterfaceModifiers(int estimate)
  5250. {
  5251.     if (! interface_modifiers)
  5252.         interface_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5253. }
  5254.  
  5255. inline void AstInterfaceDeclaration::AddInterfaceModifier(AstModifier *interface_modifier)
  5256. {
  5257.     if (! interface_modifiers)
  5258.         AllocateInterfaceModifiers(4); // there are only 10 modifiers.
  5259.     interface_modifiers -> Next() = interface_modifier;
  5260. }
  5261.  
  5262. inline void AstLocalVariableDeclarationStatement::AllocateLocalModifiers(int estimate)
  5263. {
  5264.     if (! local_modifiers)
  5265.         local_modifiers = (AstArray<AstModifier *> *) pool -> NewAstArray(estimate);
  5266. }
  5267.  
  5268. inline void AstLocalVariableDeclarationStatement::AddLocalModifier(AstModifier *local_modifier)
  5269. {
  5270.     if (! local_modifiers)
  5271.         AllocateLocalModifiers(4); // there are only 10 modifiers.
  5272.     local_modifiers -> Next() = local_modifier;
  5273. }
  5274.  
  5275. inline void AstBlock::AllocateBlockStatements(int estimate)
  5276. {
  5277.     if (! block_statements)
  5278.         block_statements = pool -> NewAstArray(estimate);
  5279. }
  5280.  
  5281. inline void AstBlock::AddStatement(Ast *statement)
  5282. {
  5283.     if (! block_statements)
  5284.         AllocateBlockStatements();
  5285.     block_statements -> Next() = statement;
  5286. }
  5287.  
  5288. inline void AstSwitchBlockStatement::AllocateBlockStatements(int estimate)
  5289. {
  5290.     if (! block_statements)
  5291.         block_statements = (AstArray<AstStatement *> *) pool -> NewAstArray(estimate);
  5292. }
  5293.  
  5294. inline void AstSwitchBlockStatement::AddStatement(AstStatement *statement)
  5295. {
  5296.     if (! block_statements)
  5297.         AllocateBlockStatements();
  5298.     block_statements -> Next() = statement;
  5299. }
  5300.  
  5301. inline void AstSwitchBlockStatement::AllocateSwitchLabels(int estimate)
  5302. {
  5303.     if (! switch_labels)
  5304.         switch_labels = pool -> NewAstArray(estimate);
  5305. }
  5306.  
  5307. inline void AstSwitchBlockStatement::AddSwitchLabel(Ast *case_or_default_label)
  5308. {
  5309.     if (! switch_labels)
  5310.         AllocateSwitchLabels();
  5311.     switch_labels -> Next() = case_or_default_label;
  5312. }
  5313.  
  5314. inline void AstConstructorBlock::AllocateLocalInitStatements(int estimate)
  5315. {
  5316.     if (! local_init_statements)
  5317.         local_init_statements = (AstArray<AstStatement *> *) pool -> NewAstArray(estimate);
  5318. }
  5319.  
  5320. inline void AstConstructorBlock::AddLocalInitStatement(AstStatement *statement)
  5321. {
  5322.     if (! local_init_statements)
  5323.         AllocateLocalInitStatements();
  5324.     local_init_statements -> Next() = statement;
  5325. }
  5326.  
  5327. inline void AstVariableDeclaratorId::AllocateBrackets(int estimate)
  5328. {
  5329.     if (! brackets)
  5330.         brackets = (AstArray<AstBrackets *> *) pool -> NewAstArray(estimate);
  5331. }
  5332.  
  5333. inline void AstVariableDeclaratorId::AddBrackets(AstBrackets *bracket)
  5334. {
  5335.     if (! brackets)
  5336.         AllocateBrackets();
  5337.     brackets -> Next() = bracket;
  5338. }
  5339.  
  5340. inline void AstArrayType::AllocateBrackets(int estimate)
  5341. {
  5342.     if (! brackets)
  5343.         brackets = (AstArray<AstBrackets *> *) pool -> NewAstArray(estimate);
  5344. }
  5345.  
  5346. inline void AstArrayType::AddBrackets(AstBrackets *bracket)
  5347. {
  5348.     if (! brackets)
  5349.         AllocateBrackets();
  5350.     brackets -> Next() = bracket;
  5351. }
  5352.  
  5353. inline void AstMethodDeclarator::AllocateBrackets(int estimate)
  5354. {
  5355.     if (! brackets)
  5356.         brackets = (AstArray<AstBrackets *> *) pool -> NewAstArray(estimate);
  5357. }
  5358.  
  5359. inline void AstMethodDeclarator::AddBrackets(AstBrackets *bracket)
  5360. {
  5361.     if (! brackets)
  5362.         AllocateBrackets();
  5363.     brackets -> Next() = bracket;
  5364. }
  5365.  
  5366. inline void AstArrayCreationExpression::AllocateBrackets(int estimate)
  5367. {
  5368.     if (! brackets)
  5369.         brackets = (AstArray<AstBrackets *> *) pool -> NewAstArray(estimate);
  5370. }
  5371.  
  5372. inline void AstArrayCreationExpression::AddBrackets(AstBrackets *bracket)
  5373. {
  5374.     if (! brackets)
  5375.         AllocateBrackets();
  5376.     brackets -> Next() = bracket;
  5377. }
  5378.  
  5379. inline void AstCastExpression::AllocateBrackets(int estimate)
  5380. {
  5381.     if (! brackets)
  5382.         brackets = (AstArray<AstBrackets *> *) pool -> NewAstArray(estimate);
  5383. }
  5384.  
  5385. inline void AstCastExpression::AddBrackets(AstBrackets *bracket)
  5386. {
  5387.     if (! brackets)
  5388.         AllocateBrackets();
  5389.     brackets -> Next() = bracket;
  5390. }
  5391.  
  5392. inline void AstArrayCreationExpression::AllocateDimExprs(int estimate)
  5393. {
  5394.     if (! dim_exprs)
  5395.         dim_exprs = (AstArray<AstDimExpr *> *) pool -> NewAstArray(estimate);
  5396. }
  5397.  
  5398. inline void AstArrayCreationExpression::AddDimExpr(AstDimExpr *dim_expr)
  5399. {
  5400.     if (! dim_exprs)
  5401.         AllocateDimExprs(); // will not be executed as we can assume dim_exprs has already beenallocated
  5402.     dim_exprs -> Next() = dim_expr;
  5403. }
  5404.  
  5405. inline void AstThisCall::AllocateArguments(int estimate)
  5406. {
  5407.     if (! arguments)
  5408.         arguments = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5409. }
  5410.  
  5411. inline void AstThisCall::AddArgument(AstExpression *argument)
  5412. {
  5413.     if (! arguments)
  5414.         AllocateArguments(); // will not be executed as we can assume arguments has already beenallocated
  5415.     arguments -> Next() = argument;
  5416. }
  5417.  
  5418. inline void AstSuperCall::AllocateArguments(int estimate)
  5419. {
  5420.     if (! arguments)
  5421.         arguments = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5422. }
  5423.  
  5424. inline void AstSuperCall::AddArgument(AstExpression *argument)
  5425. {
  5426.     if (! arguments)
  5427.         AllocateArguments(); // will not be executed as we can assume arguments has already beenallocated
  5428.     arguments -> Next() = argument;
  5429. }
  5430.  
  5431. inline void AstClassInstanceCreationExpression::AllocateArguments(int estimate)
  5432. {
  5433.     if (! arguments)
  5434.         arguments = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5435. }
  5436.  
  5437. inline void AstClassInstanceCreationExpression::AddArgument(AstExpression *argument)
  5438. {
  5439.     if (! arguments)
  5440.         AllocateArguments(); // will not be executed as we can assume arguments has already beenallocated
  5441.     arguments -> Next() = argument;
  5442. }
  5443.  
  5444. inline void AstMethodInvocation::AllocateArguments(int estimate)
  5445. {
  5446.     if (! arguments)
  5447.         arguments = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5448. }
  5449.  
  5450. inline void AstMethodInvocation::AddArgument(AstExpression *argument)
  5451. {
  5452.     if (! arguments)
  5453.         AllocateArguments(); // will not be executed as we can assume arguments has already beenallocated
  5454.     arguments -> Next() = argument;
  5455. }
  5456.  
  5457. inline void AstThisCall::AllocateLocalArguments(int estimate)
  5458. {
  5459.     if (! local_arguments_opt)
  5460.         local_arguments_opt = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5461. }
  5462.  
  5463. inline void AstThisCall::AddLocalArgument(AstExpression *argument)
  5464. {
  5465.     if (! local_arguments_opt)
  5466.         AllocateLocalArguments();
  5467.     local_arguments_opt -> Next() = argument;
  5468. }
  5469.  
  5470. inline void AstSuperCall::AllocateLocalArguments(int estimate)
  5471. {
  5472.     if (! local_arguments_opt)
  5473.         local_arguments_opt = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5474. }
  5475.  
  5476. inline void AstSuperCall::AddLocalArgument(AstExpression *argument)
  5477. {
  5478.     if (! local_arguments_opt)
  5479.         AllocateLocalArguments();
  5480.     local_arguments_opt -> Next() = argument;
  5481. }
  5482.  
  5483. inline void AstClassInstanceCreationExpression::AllocateLocalArguments(int estimate)
  5484. {
  5485.     if (! local_arguments_opt)
  5486.         local_arguments_opt = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5487. }
  5488.  
  5489. inline void AstClassInstanceCreationExpression::AddLocalArgument(AstExpression *argument)
  5490. {
  5491.     if (! local_arguments_opt)
  5492.         AllocateLocalArguments();
  5493.     local_arguments_opt -> Next() = argument;
  5494. }
  5495.  
  5496. inline void AstMethodDeclaration::AllocateThrows(int estimate)
  5497. {
  5498.     if (! throws)
  5499.         throws = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5500. }
  5501.  
  5502. inline void AstMethodDeclaration::AddThrow(AstExpression *exception)
  5503. {
  5504.     if (! throws)
  5505.         AllocateThrows();
  5506.     throws -> Next() = exception;
  5507. }
  5508.  
  5509. inline void AstConstructorDeclaration::AllocateThrows(int estimate)
  5510. {
  5511.     if (! throws)
  5512.         throws = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5513. }
  5514.  
  5515. inline void AstConstructorDeclaration::AddThrow(AstExpression *exception)
  5516. {
  5517.     if (! throws)
  5518.         AllocateThrows();
  5519.     throws -> Next() = exception;
  5520. }
  5521.  
  5522. inline void AstMethodDeclarator::AllocateFormalParameters(int estimate)
  5523. {
  5524.     if (! formal_parameters)
  5525.         formal_parameters = (AstArray<AstFormalParameter *> *) pool -> NewAstArray(estimate);
  5526. }
  5527.  
  5528. inline void AstMethodDeclarator::AddFormalParameter(AstFormalParameter *formal_parameter)
  5529. {
  5530.     if (! formal_parameters)
  5531.         AllocateFormalParameters();
  5532.     formal_parameters -> Next() = formal_parameter;
  5533. }
  5534.  
  5535. inline void AstLocalVariableDeclarationStatement::AllocateVariableDeclarators(int estimate)
  5536. {
  5537.     if (! variable_declarators)
  5538.         variable_declarators = (AstArray<AstVariableDeclarator *> *) pool -> NewAstArray(estimate);
  5539. }
  5540.  
  5541. inline void AstLocalVariableDeclarationStatement::AddVariableDeclarator(AstVariableDeclarator *variable_declarator)
  5542. {
  5543.     if (! variable_declarators)
  5544.         AllocateVariableDeclarators();
  5545.     variable_declarators -> Next() = variable_declarator;
  5546. }
  5547.  
  5548. inline void AstFieldDeclaration::AllocateVariableDeclarators(int estimate)
  5549. {
  5550.     if (! variable_declarators)
  5551.         variable_declarators = (AstArray<AstVariableDeclarator *> *) pool -> NewAstArray(estimate);
  5552. }
  5553.  
  5554. inline void AstFieldDeclaration::AddVariableDeclarator(AstVariableDeclarator *variable_declarator)
  5555. {
  5556.     if (! variable_declarators)
  5557.         AllocateVariableDeclarators();
  5558.     variable_declarators -> Next() = variable_declarator;
  5559. }
  5560.  
  5561. inline void AstClassDeclaration::AllocateInterfaces(int estimate)
  5562. {
  5563.     if (! interfaces)
  5564.         interfaces = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5565. }
  5566.  
  5567. inline void AstClassDeclaration::AddInterface(AstExpression *interf)
  5568. {
  5569.     if (! interfaces)
  5570.         AllocateInterfaces();
  5571.     interfaces -> Next() = interf;
  5572. }
  5573.  
  5574. inline void AstInterfaceDeclaration::AllocateExtendsInterfaces(int estimate)
  5575. {
  5576.     if (! extends_interfaces)
  5577.         extends_interfaces = (AstArray<AstExpression *> *) pool -> NewAstArray(estimate);
  5578. }
  5579.  
  5580. inline void AstInterfaceDeclaration::AddExtendsInterface(AstExpression *interf)
  5581. {
  5582.     if (! extends_interfaces)
  5583.         AllocateExtendsInterfaces();
  5584.     extends_interfaces -> Next() = interf;
  5585. }
  5586.  
  5587. inline void AstInterfaceDeclaration::AllocateInterfaceMemberDeclarations(int estimate)
  5588. {
  5589.     if (! interface_member_declarations)
  5590.         interface_member_declarations = pool -> NewAstArray(estimate);
  5591. }
  5592.  
  5593. inline void AstInterfaceDeclaration::AddInterfaceMemberDeclaration(Ast *member)
  5594. {
  5595.     if (! interface_member_declarations)
  5596.         AllocateInterfaceMemberDeclarations();
  5597.     interface_member_declarations -> Next() = member;
  5598. }
  5599.  
  5600. inline void AstClassBody::AllocateClassBodyDeclarations(int estimate)
  5601. {
  5602.     if (! class_body_declarations)
  5603.         class_body_declarations = pool -> NewAstArray(estimate);
  5604. }
  5605.  
  5606. inline void AstClassBody::AddClassBodyDeclaration(Ast *member)
  5607. {
  5608.     if (! class_body_declarations)
  5609.         AllocateClassBodyDeclarations();
  5610.     class_body_declarations -> Next() = member;
  5611. }
  5612.  
  5613. inline void AstForStatement::AllocateForInitStatements(int estimate)
  5614. {
  5615.     if (! for_init_statements)
  5616.         for_init_statements = (AstArray<AstStatement *> *) pool -> NewAstArray(estimate);
  5617. }
  5618.  
  5619. inline void AstForStatement::AddForInitStatement(AstStatement *statement)
  5620. {
  5621.     if (! for_init_statements)
  5622.         AllocateForInitStatements();
  5623.     for_init_statements -> Next() = statement;
  5624. }
  5625.  
  5626. inline void AstForStatement::AllocateForUpdateStatements(int estimate)
  5627. {
  5628.     if (! for_update_statements)
  5629.         for_update_statements = (AstArray<AstExpressionStatement *> *) pool -> NewAstArray(estimate);
  5630. }
  5631.  
  5632. inline void AstForStatement::AddForUpdateStatement(AstExpressionStatement *statement)
  5633. {
  5634.     if (! for_update_statements)
  5635.         AllocateForUpdateStatements();
  5636.     for_update_statements -> Next() = statement;
  5637. }
  5638.  
  5639. inline void AstArrayInitializer::AllocateVariableInitializers(int estimate)
  5640. {
  5641.     if (! variable_initializers)
  5642.         variable_initializers = pool -> NewAstArray(estimate);
  5643. }
  5644.  
  5645. inline void AstArrayInitializer::AddVariableInitializer(Ast *initializer)
  5646. {
  5647.     if (! variable_initializers)
  5648.         AllocateVariableInitializers();
  5649.     variable_initializers -> Next() = initializer;
  5650. }
  5651.  
  5652. inline void AstTryStatement::AllocateCatchClauses(int estimate)
  5653. {
  5654.     if (! catch_clauses)
  5655.         catch_clauses = (AstArray<AstCatchClause *> *) pool -> NewAstArray(estimate);
  5656. }
  5657.  
  5658. inline void AstTryStatement::AddCatchClause(AstCatchClause *catch_clause)
  5659. {
  5660.     if (! catch_clauses)
  5661.         AllocateCatchClauses();
  5662.     catch_clauses -> Next() = catch_clause;
  5663. }
  5664.  
  5665. inline void AstCompilationUnit::AllocateImportDeclarations(int estimate)
  5666. {
  5667.     if (! import_declarations)
  5668.         import_declarations = (AstArray<AstImportDeclaration *> *) pool -> NewAstArray(estimate);
  5669. }
  5670.  
  5671. inline void AstCompilationUnit::AddImportDeclaration(AstImportDeclaration *import_declaration)
  5672. {
  5673.     if (! import_declarations)
  5674.         AllocateImportDeclarations();
  5675.     import_declarations -> Next() = import_declaration;
  5676. }
  5677.  
  5678. inline void AstCompilationUnit::AllocateTypeDeclarations(int estimate)
  5679. {
  5680.     if (! type_declarations)
  5681.         type_declarations = pool -> NewAstArray(estimate);
  5682. }
  5683.  
  5684. inline void AstCompilationUnit::AddTypeDeclaration(Ast *type_declaration)
  5685. {
  5686.     if (! type_declarations)
  5687.         AllocateTypeDeclarations();
  5688.     type_declarations -> Next() = type_declaration;
  5689. }
  5690. #endif
  5691.